33_C++ 中的字符串類

0. 歷史遺留問(wèn)題

  • C語(yǔ)言不支持真正意義上的字符串
  • C語(yǔ)言用字符數(shù)組一組函數(shù)是實(shí)現(xiàn)字符串操作
  • C語(yǔ)言不支持自定義類型,因此無(wú)法獲得字符串類型

1. 解決方案

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

2. 標(biāo)準(zhǔn)庫(kù)中的字符串類

  • C++語(yǔ)言直接支持C語(yǔ)言的所有概念
  • C++語(yǔ)言中沒(méi)有原生的字符串類型

C++標(biāo)準(zhǔn)庫(kù)提供了string類型

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

編程說(shuō)明:字符串類的使用

#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;
}

輸出結(jié)果:

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

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

3. 標(biāo)準(zhǔn)庫(kù)中的字符串類——字符串與數(shù)字的轉(zhuǎn)換:字符串流類(sstream)

  • 字符串與數(shù)字的轉(zhuǎn)換
    • 標(biāo)準(zhǔn)庫(kù)中提供了相關(guān)的類對(duì)字符串和數(shù)字進(jìn)行轉(zhuǎn)換
    • 字符串流類(sstream)用于string的轉(zhuǎn)換

<sstream> - 相關(guān)頭文件
istringstream - 字符串輸入流
ostringstream - 字符串輸出流

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

編程說(shuō)明:字符串和數(shù)字的轉(zhuǎn)換

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

// 使用宏來(lái)轉(zhuǎn)換,用到了臨時(shí)對(duì)象
#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) // 使用全局函數(shù)來(lái)將字符串轉(zhuǎn)化為數(shù)字(數(shù)字類型只能固定,需要用到后面的模板)
{
    istringstream iss(s);
    return iss >> n;
}
*/

/*
string to_string(int n)     // 使用全局函數(shù)來(lái)將數(shù)字轉(zhuǎn)化為字符串(數(shù)字類型只能固定,需要用到后面的模板)     
{
    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;
}

輸出結(jié)果:

123
789

4. 面試題分析:字符串循環(huán)右移

編程說(shuō)明:字符串循環(huán)右移

#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;
}

輸出結(jié)果:

efgabcd

5. 小結(jié)

  • 應(yīng)用開發(fā)中大多數(shù)的情況都是在進(jìn)行字符串處理
  • C++中沒(méi)有直接支持原生的字符串類型
  • 標(biāo)準(zhǔn)庫(kù)中string類支持字符串的概念
  • string類支持字符串數(shù)字的相互轉(zhuǎn)換
  • string類的應(yīng)用使得問(wèn)題的求解變得簡(jiǎn)單

6. 課后練習(xí)

字符串反轉(zhuǎn)

自己測(cè)試通過(guò)的代碼,希望有朋友看到后提出不同的測(cè)試代碼,一起討論。測(cè)試過(guò)程中,由于作業(yè)要求必須傳入const string& s,只讀字符串的轉(zhuǎn)換困擾我許久,后來(lái)通過(guò)強(qiáng)制轉(zhuǎn)換后實(shí)現(xiàn)并測(cè)試通過(guò)

#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;
}

輸出結(jié)果:


;
edcba;
ew;thginot;uoy
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,706評(píng)論 18 399
  • 一、字符串操作 strcpy(p, p1) 復(fù)制字符串 strncpy(p, p1, n) 復(fù)制指定長(zhǎng)度字符串 s...
    JaiUnChat閱讀 1,752評(píng)論 0 7
  • 1)字符串操作strcpy(p, p1) 復(fù)制字符串strncpy(p, p1, n) 復(fù)制指定長(zhǎng)度字符串strc...
    XDgbh閱讀 4,760評(píng)論 0 11
  • 前面的課程,葉武濱老師都是分享的方法的問(wèn)題,包括反思、列計(jì)劃、怎么管理事物等。此次課葉老師和我們分享了方向?qū)用娴膯?wèn)...
    皓月環(huán)宇閱讀 694評(píng)論 0 0

友情鏈接更多精彩內(nèi)容