From 8b59d554df4ee62919381a71fa9f729025d09d51 Mon Sep 17 00:00:00 2001 From: lensferno Date: Tue, 5 Apr 2022 13:34:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=9E=E7=8E=B0=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E4=BC=9A=E5=9C=A8=E5=86=85=E5=AD=98=E5=88=86=E9=85=8D?= =?UTF-8?q?=E4=B8=8A=E7=BF=BB=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- work20220401/main.cpp | 4 + work20220401/neoString/CString.cpp | 296 +++++++++++++++++------------ work20220401/neoString/CString.h | 8 +- 3 files changed, 180 insertions(+), 128 deletions(-) diff --git a/work20220401/main.cpp b/work20220401/main.cpp index 50a9e1d..8c8e55b 100644 --- a/work20220401/main.cpp +++ b/work20220401/main.cpp @@ -1,9 +1,13 @@ +#include #include "iostream" #include "neoString/CString.h" using namespace std; int main() { +// char *p = new char[15](); +// strncpy(p, "asdf", 4); +// cout << p; int n, i, j; while (cin >> n) { CString *c = new CString[n + 2]; diff --git a/work20220401/neoString/CString.cpp b/work20220401/neoString/CString.cpp index 45c6f7d..45408af 100644 --- a/work20220401/neoString/CString.cpp +++ b/work20220401/neoString/CString.cpp @@ -1,125 +1,171 @@ -// -// Created by lenfrex on 2022/4/4. -// - -#include -#include - -#include "CString.h" - -/* - * 按照给定大小来初始化字符串数据 - */ -CString::CString(int length) { - data = new char[length](); - CString::length = length; -} - -CString::~CString() { - delete[] data; -} - -/* - * 不设定初始化大小就默认512个字符来初始化 - */ -CString::CString() : CString(512) {} - -/* - * 重载等号。借鉴了Java中String类的equal()方法的实现。 - * 首先比较两字符串长度,如果长度不一样不用说,直接返回false;如果data为nullptr,不做比较并返回false - * 相同的话再比较两字符串数据指针指向地址是否一样,一样就代表指向的是同一块内存,直接返回true - * 两者都不同才进行逐字比较 - */ -bool CString::operator==(const CString &source) const { - // 判断两CString长度以及本对象data成员是否为空指针 - if (source.length != length || data == nullptr) { - return false; - } else { - // 判断两对象data成员是否指向同一内存块 - if (source.data == data) { - return true; - } - } - - // 以上情况都不符合时才进行逐字比较 - int compareLength = std::min(source.length, length); - for (int i = 0; i < compareLength; ++i) { - if (data[i] != source.data[i]) { - return false; - } - } - return true; -} - -/* - * 从源中复制字符串来构建新的对象 - */ -CString::CString(char *source) : CString((int)strlen(source)) { - strncpy(data, source, length); -} - -/* - * 从源中复制字符串来构建新的对象,并定义初始长度,小于源字符串则会被截取 - */ -CString::CString(char *source, int length) : CString(length) { - strncpy(data, source, length); -} - -CString &CString::operator=(const CString &source) { - // 处理自己给自己赋值的情况,那叫啥,自赋值 - if (this == &source) { - return *this; - } - - if (data != nullptr && length != 0) { - delete[] data; - } - - this->length = source.length; - this->data = new char[length](); - - strncpy(data, source.data, length); - - return *this; -} - -CString &CString::operator+=(const CString &source) { - if (data == nullptr && length == 0) { - this->length = source.length; - this->data = new char[length](); - } - - char *tmp = new char[length](); - strncpy(tmp, data, length); - - // 重新分配内存,防止拼接后溢出 - delete[] data; - this->length += source.length; - this->data = new char[this->length]; - - strcpy(tmp, data); - strncat(data, source.data, source.length); - - return *this; -} - -CString::CString(const CString &source) : CString(source.data, source.length) {} - -/* - * 按照字典顺序逐字对比 - */ -bool CString::operator<(const CString &source) const { - // 这部分类似于前边==重载的前置判断,如果本对象数据为null或者两对象数据是一回事就直接false - if (data == nullptr || (source.length != length && source.data == data)) { - return false; - } - - // 以上情况都不符合时才进行逐字比较 - int compareLength = std::min(source.length, length); - for (int i = 0; i < compareLength; ++i) { - if (data[i] < source.data[i]) { - return true; - } - } - return false; -} +锘// +// Created by lenfrex on 2022/4/4. +// + +#include +#include + +#include "CString.h" + +/* + * 鎸夌収缁欏畾澶у皬鏉ュ垵濮嬪寲瀛楃涓叉暟鎹 + */ +CString::CString(int length) { + data = new char[length](); +} + +CString::~CString() { + delete[] data; + data = nullptr; +} + +/* + * 涓嶈瀹氬垵濮嬪寲澶у皬灏遍粯璁512涓瓧绗︽潵鍒濆鍖 + */ +CString::CString() : CString(512) {} + +/* + * 閲嶈浇绛夊彿銆傚熼壌浜咼ava涓璖tring绫荤殑equal()鏂规硶鐨勫疄鐜版濊矾銆 + * 棣栧厛鍒ゆ柇data鏄惁涓簄ullptr锛屽悓涓簄ull鍒檛rue锛屽惁鍒欏氨鏄痜alse + * 鍐嶆瘮杈冧袱瀛楃涓查暱搴︼紝濡傛灉闀垮害涓嶄竴鏍蜂笉鐢ㄨ锛岀洿鎺ヨ繑鍥瀎alse锛 + * 鐩稿悓鐨勮瘽鍐嶆瘮杈冧袱瀛楃涓叉暟鎹寚閽堟寚鍚戝湴鍧鏄惁涓鏍凤紝涓鏍峰氨浠h〃鎸囧悜鐨勬槸鍚屼竴鍧楀唴瀛橈紝鐩存帴杩斿洖true + * 涓よ呴兘涓嶅悓鎵嶈繘琛岄愬瓧姣旇緝 + */ +bool CString::operator==(const CString &source) const { + // 棣栧厛鍒ゆ柇涓String瀵硅薄data鎴愬憳鏄惁涓虹┖鎸囬拡 + if (source.data == nullptr || this->data == nullptr) { + return source.data == nullptr && this->data == nullptr; + } + + int length = (int)strlen(data); + int sourceLength = (int)strlen(source.data); + + // 瀛楃涓查暱搴︿笉绛夛紝瀛楃涓茶偗瀹氭槸涓嶇瓑 + if (length != sourceLength) { + return false; + } else { + // 闀垮害鐩哥瓑涓攄ata鎸囧悜鐩稿悓鑲畾绛 + if (source.data == this->data) { + return true; + } + } + + // 浠ヤ笂鎯呭喌閮戒笉绗﹀悎鏃舵墠杩涜閫愬瓧姣旇緝 + int compareLength = std::min(sourceLength, length); + for (int i = 0; i < compareLength; ++i) { + if (data[i] != source.data[i]) { + return false; + } + } + return true; +} + +/* + * 浠庢簮涓鍒跺瓧绗︿覆鏉ユ瀯寤烘柊鐨勫璞 + */ +CString::CString(char *source) : CString((int)strlen(source)) { + strcpy(data, source); +} + +/* + * 浠庢簮涓鍒跺瓧绗︿覆鏉ユ瀯寤烘柊鐨勫璞★紝骞跺畾涔夊垵濮嬮暱搴︼紝灏忎簬婧愬瓧绗︿覆鍒欎細琚埅鍙 + */ +CString::CString(char *source, int length) : CString(length) { + strncpy(data, source, length); +} + +CString &CString::operator=(const CString &source) { + // 澶勭悊鑷繁缁欒嚜宸辫祴鍊肩殑鎯呭喌锛岄偅鍙暐锛岃嚜璧嬪 + if (this == &source) { + return *this; + } + + delete[] data; + + // 绛夊彿鍙充晶绌烘寚閽堢殑璇濈洿鎺ata璧嬩负绌烘寚閽 + // 杩欓噷鍦ㄦ墽琛屽墠灏卞凡缁廳elete鎺塪ata鐨勬暟鎹簡锛屼笉浼氭硠婕 + if (source.data == nullptr) { + this->data = nullptr; + return *this; + } + + int sourceLength = (int)strlen(source.data); + + this->data = new char[sourceLength](); + strcpy(data, source.data); + + return *this; +} + +CString &CString::operator+=(const CString &source) { + // nullptr涓嶅仛澶勭悊 + if(source.data == nullptr) { + return *this; + } + + int sourceLength = (int)strlen(source.data); + int length = 0; + + // 鏈璞ullptr鐨勮瘽灏辩洿鎺ユ柊鍒嗛厤 + if (data == nullptr) { + this->data = new char[sourceLength](); + length = sourceLength; + } else { + length = (int)strlen(data); + } + + // 淇濆瓨鎷兼帴鍓嶇殑鍘熸暟鎹紝浠ヤ究閲嶆柊鍒嗛厤瓒冲鐨勫唴瀛 + char *old = new char[length](); + strcpy(old, data); + + // 閲嶆柊鍒嗛厤鍐呭瓨锛岄槻姝㈡嫾鎺ュ悗婧㈠嚭 + length += sourceLength; + delete[] data; + this->data = new char[length](); + + strcpy(data, old); + strcat(data, "--"); + strncat(data, source.data, sourceLength); + + return *this; +} + +CString::CString(const CString &source) : CString(source.data) {} + +/* + * 鎸夌収瀛楀吀椤哄簭閫愬瓧瀵规瘮 + */ +bool CString::operator>(const CString &source) const { + // 棣栧厛鍒ゆ柇涓String瀵硅薄data鎴愬憳鏄惁涓虹┖鎸囬拡锛岀┖鐩存帴杩斿洖false + if (source.data == nullptr || this->data == nullptr) { + std::cout << "nullptr!"<< std::endl; + return false; + } + + int length = (int)strlen(data); + int sourceLength = (int)strlen(source.data); + + // 涓ゅ璞℃寚鍚慸ata鍚屼竴鍐呭瓨鍖哄煙骞朵笖闀垮害鐩哥瓑鍒欏彲浠ュ垽鏂袱瀛楃涓茬浉绛夛紝鎵浠ュ氨涓嶆槸"<" + if (sourceLength == length && source.data == this->data) { + std::cout << "memsame" << std::endl; + return false; + } + + // 浠ヤ笂鎯呭喌閮戒笉绗﹀悎鏃舵墠杩涜閫愬瓧姣旇緝 + int compareLength = std::min(sourceLength, length); + for (int i = 0; i < compareLength; ++i) { + if (data[i] > source.data[i]) { + std::cout << "data[i]: " << data[i] << " source.data[i]: " << source.data[i] << std::endl; + return true; + } + } + return false; +} + +std::ostream &operator<<(std::ostream &outputStream, const CString &source) { + return outputStream << source.data; +} + +std::istream &operator>>(std::istream &inputStream, const CString &source) { + return inputStream >> source.data; +} diff --git a/work20220401/neoString/CString.h b/work20220401/neoString/CString.h index 940217b..1b3bc0e 100644 --- a/work20220401/neoString/CString.h +++ b/work20220401/neoString/CString.h @@ -5,13 +5,13 @@ #ifndef WORK20220401_CSTRING_H #define WORK20220401_CSTRING_H +#include #include "utility" using namespace std::rel_ops; class CString { private: char *data = nullptr; - int length = 0; public: explicit CString(int length); @@ -27,12 +27,14 @@ public: bool operator==(const CString &source) const; - bool operator<(const CString &source) const; + bool operator>(const CString &source) const; CString &operator+=(const CString &source); CString &operator=(const CString &source); -}; + friend std::ostream &operator<<(std::ostream &outputStream, const CString &source); + friend std::istream &operator>>(std::istream &outputStream, const CString &source); +}; #endif //WORK20220401_CSTRING_H