33_C++ 中的字符串類

0. 歷史遺留問題

  • C語言不支持真正意義上的字符串
  • C語言用字符數組一組函數是實現字符串操作
  • C語言不支持自定義類型,因此無法獲得字符串類型

1. 解決方案

  • 從C到C++的進化過程引入了自定義類型
  • 在C++中可以通過類完成字符串類型的定義

2. 標準庫中的字符串類

  • C++語言直接支持C語言的所有概念
  • C++語言中沒有原生的字符串類型

C++標準庫提供了string類型

  • string 直接支持字符串連接
  • string 直接支持字符串的大小比較
  • string 直接支持子串查找和提取
  • string 直接支持字符串的插入和替換

編程說明:字符串類的使用

#include <iostream>
#include <string>

using namespace std;

void string_sort(string a[], int len)
{
    for(int i=0; i<len; i++)
    {
        for(int j=i; j<len; j++)
        {
            if( a[i] > a[j] ) 
            {
                swap(a[i], a[j]);
            }
        }
    }
}

string string_add(string a[], int len)
{
    string ret = "";
    
    for(int i=0; i<len; i++)
    {
        ret += a[i] + "; ";
    }

    return ret;
}

void print(string a[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout << a[i] << endl;
    }
}

int main()
{
    string sa[7] = 
    {
        "Hello World", 
        "D.T.Software",
        "C#",
        "Java",
        "C++",
        "Python",
        "TypeScript"
    };
    
    string_sort(sa, 7);

    print(sa, 7);
    
    cout << endl;
    
    cout << string_add(sa, 7) << endl;  
    
    return 0;
}

輸出結果:

C#
C++
D.T.Software
Hello World
Java
Python
TypeScript

C#; C++; D.T.Software; Hello World; Java; Python; TypeScript; 

3. 標準庫中的字符串類——字符串與數字的轉換:字符串流類(sstream)

  • 字符串與數字的轉換
    • 標準庫中提供了相關的類對字符串和數字進行轉換
    • 字符串流類(sstream)用于string的轉換

<sstream> - 相關頭文件
istringstream - 字符串輸入流
ostringstream - 字符串輸出流

  • 使用方法:
  • string -> 數字:
istringstream iss("123.45");
double num;
iss >> num;
  • 數字 -> string
ostringstream oss;
oss << 543.21;
string s = oss.str();

編程說明:字符串和數字的轉換

#include <iostream>
#include <sstream>
#include <string>

// 使用宏來轉換,用到了臨時對象
#define TONUMBER(s, n) (istringstream(s)>>n)    
#define TOSTRING(n) (((ostringstream&)(ostringstream() << n)).str())

using namespace std;

/*
bool to_number(const string& s, int& n) // 使用全局函數來將字符串轉化為數字(數字類型只能固定,需要用到后面的模板)
{
    istringstream iss(s);
    return iss >> n;
}
*/

/*
string to_string(int n)     // 使用全局函數來將數字轉化為字符串(數字類型只能固定,需要用到后面的模板)     
{
    string s = "";
    
    ostringstream oss;
    oss << n;
    
    s = oss.str();
    
    return s;
}
*/

int main()
{
    int num = 0;
    
    if(TONUMBER("123", num))
    {
        cout << num << endl;
    }
    
    cout << TOSTRING(789) << endl;

    return 0;
}

輸出結果:

123
789

4. 面試題分析:字符串循環右移

編程說明:字符串循環右移

#include <iostream>
#include <string>

using namespace std;

string operator >> (const string& s, unsigned int n)
{
    string ret = "";
    
    // abcdefd ==> 3 ==> efgabcd

    unsigned int pos = 0;

    n = n % s.length();
    pos = s.length() - n;
    ret = s.substr(pos);
    ret += s.substr(0, pos);

    return ret;
}

int main()
{

    string str = "abcdefg";

    cout << (str >> 3) << endl;

    return 0;
}

輸出結果:

efgabcd

5. 小結

  • 應用開發中大多數的情況都是在進行字符串處理
  • C++中沒有直接支持原生的字符串類型
  • 標準庫中string類支持字符串的概念
  • string類支持字符串數字的相互轉換
  • string類的應用使得問題的求解變得簡單

6. 課后練習

字符串反轉

自己測試通過的代碼,希望有朋友看到后提出不同的測試代碼,一起討論。測試過程中,由于作業要求必須傳入const string& s,只讀字符串的轉換困擾我許久,后來通過強制轉換后實現并測試通過

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string str_reverse(const string& s, const char c)
{
    string ret = "";
    string* ss = const_cast<string*> (&s);
    int n = (*ss).find(c);

    while( n != string::npos)
    {
        string sub_str = "";
        int pos = 0;

        sub_str = (*ss).substr(pos, n);
        reverse(sub_str.begin(), sub_str.end());
        ret += sub_str + c; 
        (*ss) = (*ss).substr(n+1);
        n = (*ss).find(c);
    }

    reverse((*ss).begin(), (*ss).end());    
    ret += (*ss);
    
    return ret;
}


int main()
{
    cout << str_reverse("", ';') << endl;                 // 輸出:空字符串
    cout << str_reverse(";", ';') << endl;                // 輸出:;
    cout << str_reverse("abcde;", ';') << endl;           // 輸出:edcba;
    cout << str_reverse("we;tonight;you", ';') << endl;   // 輸出:ew;thginot;uoy


    return 0;
}

輸出結果:


;
edcba;
ew;thginot;uoy
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,826評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,733評論 18 399
  • 一、字符串操作 strcpy(p, p1) 復制字符串 strncpy(p, p1, n) 復制指定長度字符串 s...
    JaiUnChat閱讀 1,670評論 0 7
  • 1)字符串操作strcpy(p, p1) 復制字符串strncpy(p, p1, n) 復制指定長度字符串strc...
    XDgbh閱讀 4,475評論 0 10
  • 前面的課程,葉武濱老師都是分享的方法的問題,包括反思、列計劃、怎么管理事物等。此次課葉老師和我們分享了方向層面的問...
    皓月環宇閱讀 607評論 0 0