日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符串类String

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串类String 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 字符串類的初步設計
      • 1.1 歷史遺留問題
      • 1.2 字符串類的初步設計
      • 1.3 代碼實現
    • 2 字符串類功能的進一步實現
      • 2.1 重載數組訪問操作符[]
      • 2.2 判斷是否以指定字符串開始或結束
      • 2.3 在指定位置處插入字符串
      • 2.4 去掉字符串兩端的空白字符

1 字符串類的初步設計

1.1 歷史遺留問題

  • C語言不支持真正意義上的字符串。
  • C語言用字符數組和一組函數實現字符串操作。
  • C語言不支持自定義類型,因此無法獲得字符串類型。
  • 從C到C++的進化過程中引入了自定義類型,在C++中可以通過類完成字符串類型的定義。

1.2 字符串類的初步設計


類的聲明如下:

實現時的注意事項:

  • 無縫實現String對象與char*字符串的互操作。
  • 操作符重載函數需要考慮是否支持const操作。
  • 通過C語言中的字符串函數實現String的成員函數。

1.3 代碼實現

String.h:

#ifndef LSTRING_H #define LSTRING_H#include "Object.h" #include "Exception.h"namespace LemonLib {#define STR(str) (str ? str : "")class String : public Object { protected:char* m_str;int m_length;void init(const char* str); public:String();String(const char* str);String(char c);String(const String& s);String& operator = (const char* str);String& operator = (const String& s);String& operator = (char c);bool operator == (const char* str) const;bool operator == (const String& s) const;bool operator != (const char* str) const;bool operator != (const String& s) const;bool operator > (const char* str) const;bool operator > (const String& s) const;bool operator >= (const char* str) const;bool operator >= (const String& s) const;bool operator < (const char* str) const;bool operator < (const String& s) const;bool operator <= (const char* str) const;bool operator <= (const String& s) const;String operator + (const char* str) const;String operator + (const String& s) const;String& operator += (const char* str);String& operator += (const String& s);int length() const;const char* str() const;~String(); }; }#endif // STRING_H

String.cpp:

#include "LString.h" #include <cstring> #include <cstdlib>using namespace std;namespace LemonLib { void String::init(const char* str) {m_str = strdup(STR(str));if (m_str != NULL){m_length = strlen(m_str);}else{THROW_EXCEPTION(NoEnoughMemoryException, "string init error, no enough memory");} }String::String() {init(""); }String::String(const char* str) {init(str); }String::String(char c) {char str[] = {c, '\0'};init(str); }String::String(const String& s) {init(s.m_str); }String& String::operator = (char c) {char str[] = {c, '\0'};return (*this = str); }String& String::operator = (const char* str) {if (m_str != str){free(m_str);init(str);}return *this; }String& String::operator = (const String& s) {return (*this = s.m_str); }int String::length() const {return m_length; }const char* String::str() const {return m_str; }bool String::operator == (const char* str) const {return strcmp(m_str, str) == 0; }bool String::operator == (const String& s) const {return (*this == s.m_str); }bool String::operator != (const char* str) const {return !(*this == str); }bool String::operator != (const String& s) const {return !(*this == s); }bool String::operator > (const char* str) const {return strcmp(m_str, STR(str)) > 0; }bool String::operator > (const String& s) const {return (*this > s.m_str); }bool String::operator >= (const char* str) const {return strcmp(m_str, STR(str)) >= 0; }bool String::operator >= (const String& s) const {return (*this >= s.m_str); }bool String::operator < (const char* str) const {return strcmp(m_str, str) < 0; }bool String::operator < (const String& s) const {return (*this < s.m_str); }bool String::operator <= (const char* str) const {return strcmp(m_str, STR(str)) <= 0; }bool String::operator <= (const String& s) const {return (*this <= s.m_str); }String String::operator + (const char* str) const {int len = m_length + strlen(STR(str));String ret;char* p = reinterpret_cast<char*>(malloc(len + 1));if (p != NULL){strcpy(p, m_str);strcat(p, STR(str));free(ret.m_str);ret.m_str = p;ret.m_length = len;return ret;}else{THROW_EXCEPTION(NoEnoughMemoryException, "string operator + error, no enough memory");} }String String::operator + (const String& s) const {return (*this + s.m_str); }String& String::operator += (const char* str) {return (*this = *this + str); }String& String::operator += (const String& s) {return (*this += s.m_str); }String::~String() {free(m_str); } }

2 字符串類功能的進一步實現

接下來主要實現如下函數:

2.1 重載數組訪問操作符[]

函數聲明:

char& operator [] (int i); char operator [] (int i) const;

注意事項:

  • 當i的取值不合法時,拋出異常:
    • 合法范圍:(0 <= i) && (i < m_length)

代碼實現如下:

char& String::operator [] (int i) {if ((0 <= i) && (i < m_length)){return m_str[i];}else{THROW_EXCEPTION(IndexOutOfBoundsException, "string operator [] error, out index");} }char String::operator [] (int i) const {return (const_cast<String&>(*this))[i]; }

2.2 判斷是否以指定字符串開始或結束

函數聲明:

bool startWith(const char* s) const; bool startWith(const String& s) const; bool endOf(const char* s) const; bool endOf(const String& s) const;

示意圖:

代碼實現:

bool String::is_equal(const char* str1, const char* str2, int len) const {bool ret = true;for (int i=0; i<len; i++){if (str1[i] != str2[i]){ret = false;break;}}return ret; }bool String::startWith(const char* s) const {bool ret = (s != NULL);if (ret){int len = strlen(s);ret = (len < m_length) && is_equal(m_str, s, len);}return ret; }bool String::startWith(const String& s) const {return startWith(s.m_str); }bool String::endOf(const char* s) const {bool ret = (s != NULL);if (ret){int len = strlen(s);ret = (len < m_length) && is_equal(m_str + m_length - len, s, len);}return ret; }bool String::endOf(const String& s) const {return endOf(s.m_str); }

2.3 在指定位置處插入字符串

函數聲明:

String& insert(int i, const char* s); String& insert(int i, const String& s);

示意圖:


代碼實現:

String& String::insert(int i, const char* s) {bool ret = (s != NULL);if (ret){if ((0 <= i) && (i <= m_length)){int len = strlen(s);char* str = reinterpret_cast<char*>(malloc(m_length + len + 1));if (str != NULL){strncpy(str, m_str, i);strncpy(str+i, s, len);strncpy(str+i+len, m_str+i, m_length-i);str[m_length+len] = '\0';free(m_str);m_str = str;m_length = m_length + len + 1;}else{THROW_EXCEPTION(NoEnoughMemoryException, "string insert error, no enough memory");}}}return *this; }String& String::insert(int i, const String& s) {return insert(i, s.m_str); }

2.4 去掉字符串兩端的空白字符

函數聲明:

String& trim();

示意圖:

代碼實現:

String& String::trim() {if (m_length > 0){int begin = 0, end = m_length - 1;while (m_str[begin] == ' ') begin++;while (m_str[end] == ' ') end--;if (begin == 0){m_str[end + 1] = '\0';m_length = end + 1;}else{for (int i=0, j=begin; j<=end; i++, j++){m_str[i] = m_str[j];}m_str[end - begin + 1] = '\0';m_length = end - begin + 1;}}return *this; }

總結

以上是生活随笔為你收集整理的字符串类String的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。