程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++基礎知識 >> C++ string類詳解

C++ string類詳解

編輯:C++基礎知識
C++ 大大增強了對字符串的支持,除了可以使用C風格的字符串,還可以使用內置的 string 類。string 類處理起字符串來會方便很多,完全可以代替C語言中的字符數組或字符串指針。

string 是 C++ 中常用的一個類,它非常重要,我們有必要在此單獨講解一下。

使用 string 類需要包含頭文件<string>,下面的例子介紹了幾種定義 string 變量(對象)的方法:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1;
    string s2 = "c plus plus";
    string s3 = s2;
    string s4 (5, 's');
    return 0;
}
變量 s1 只是定義但沒有初始化,編譯器會將默認值賦給 s1,默認值是"",也即空字符串。

變量 s2 在定義的同時被初始化為"c plus plus"。與C風格的字符串不同,string 的結尾沒有結束標志'\0'

變量 s3 在定義的時候直接用 s2 進行初始化,因此 s3 的內容也是"c plus plus"

變量 s4 被初始化為由 5 個's'字符組成的字符串,也就是"sssss"

從上面的代碼可以看出,string 變量可以直接通過賦值操作符=進行賦值。string 變量也可以用C風格的字符串進行賦值,例如,s2 是用一個字符串常量進行初始化的,而 s3 則是通過 s2 變量進行初始化的。

與C風格的字符串不同,當我們需要知道字符串長度時,可以調用 string 類提供的 length() 函數。如下所示:
string s = "http://c.biancheng.net";
int len = s.length();
cout<<len<<endl;
輸出結果為22。由於 string 的末尾沒有'\0'字符,所以 length() 返回的是字符串的真實長度,而不是長度 +1。

轉換為C風格的字符串

雖然 C++ 提供了 string 類來替代C語言中的字符串,但是在實際編程中,有時候必須要使用C風格的字符串(例如打開文件時的路徑),為此,string 類為我們提供了一個轉換函數 c_str(),該函數能夠將 string 字符串轉換為C風格的字符串,並返回該字符串的 const 指針(const char*)。請看下面的代碼:
string path = "D:\\demo.txt";
FILE *fp = fopen(path.c_str(), "rt");
為了使用C語言中的 fopen() 函數打開文件,必須將 string 字符串轉換為C風格的字符串。

string 字符串的輸入輸出

string 類重載了輸入輸出運算符,可以像對待普通變量那樣對待 string 變量,也就是用>>進行輸入,用<<進行輸出。請看下面的代碼:
#include <iostream>
#include <string>

using namespace std;

int main(){
    string s;
    cin>>s;  //輸入字符串
    cout<<s<<endl;  //輸出字符串
    return 0;
}
運行結果:
http://c.biancheng.net  http://vip.biancheng.net↙
http://c.biancheng.net

雖然我們輸入了兩個由空格隔開的網址,但是只輸出了一個,這是因為輸入運算符>>默認會忽略空格,遇到空格就認為輸入結束,所以最後輸入的http://vip.biancheng.net沒有被存儲到變量 s。

訪問字符串中的字符

string 字符串也可以像C風格的字符串一樣按照下標來訪問其中的每一個字符。string 字符串的起始下標仍是從 0 開始。請看下面的代碼:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s = "1234567890";
    for(int i=0,len=s.length(); i<len; i++){
        cout<<s[i]<<" ";
    }
    cout<<endl;
    s[5] = '5';
    cout<<s<<endl;
    return 0;
}
運行結果:
1 2 3 4 5 6 7 8 9 0
1234557890

本例定義了一個 string 變量 s,並賦值 "1234567890",之後用 for 循環遍歷輸出每一個字符。借助下標,除了能夠訪問每個字符,也可以修改每個字符,s[5] = '5';就將第6個字符修改為 '5',所以 s 最後為 "1234557890"。

字符串的拼接

有了 string 類,我們可以使用++=運算符來直接拼接字符串,非常方便,再也不需要使用C語言中的 strcat()、strcpy()、malloc() 等函數來拼接字符串了,再也不用擔心空間不夠會溢出了。

+來拼接字符串時,運算符的兩邊可以都是 string 字符串,也可以是一個 string 字符串和一個C風格的字符串,還可以是一個 string 字符串和一個字符數組,或者是一個 string 字符串和一個單獨的字符。請看下面的例子:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1 = "first ";
    string s2 = "second ";
    char *s3 = "third ";
    char s4[] = "fourth ";
    char ch = '@';

    string s5 = s1 + s2;
    string s6 = s1 + s3;
    string s7 = s1 + s4;
    string s8 = s1 + ch;
    
    cout<<s5<<endl<<s6<<endl<<s7<<endl<<s8<<endl;

    return 0;
}
運行結果:
first second
first third
first fourth
first @

string 字符串的增刪改查

C++ 提供的 string 類包含了若干實用的成員函數,大大方便了字符串的增加、刪除、更改、查詢等操作。

一. 插入字符串

insert() 函數可以在 string 字符串中指定的位置插入另一個字符串,它的一種原型為:

string& insert (size_t pos, const string& str);

pos 表示要插入的位置,也就是下標;str 表示要插入的字符串,它可以是 string 字符串,也可以是C風格的字符串。

請看下面的代碼:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1, s2, s3;
    s1 = s2 = "1234567890";
    s3 = "aaa";
    s1.insert(5, s3);
    cout<< s1 <<endl;
    s2.insert(5, "bbb");
    cout<< s2 <<endl;
    return 0;
}
運行結果:
12345aaa67890
12345bbb67890

insert() 函數的第一個參數有越界的可能,如果越界,則會產生運行時異常,我們將會在《C++異常(Exception)》一章中詳細講解如何捕獲這個異常。

更多 insert() 函數的原型和用法請參考:http://www.cplusplus.com/reference/string/string/insert/

二. 刪除字符串

erase() 函數可以刪除 string 中的一個子字符串。它的一種原型為:

string& erase (size_t pos = 0, size_t len = npos);

pos 表示要刪除的子字符串的起始下標,len 表示要刪除子字符串的長度。如果不指明 len 的話,那麼直接刪除從 pos 到字符串結束處的所有字符(此時 len = str.length - pos)。

請看下面的代碼:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1, s2, s3;
    s1 = s2 = s3 = "1234567890";
    s2.erase(5);
    s3.erase(5, 3);
    cout<< s1 <<endl;
    cout<< s2 <<endl;
    cout<< s3 <<endl;
    return 0;
}
運行結果:
1234567890
12345
1234590

有讀者擔心,在 pos 參數沒有越界的情況下, len 參數也可能會導致要刪除的子字符串越界。但實際上這種情況不會發生,erase() 函數會從以下兩個值中取出最小的一個作為待刪除子字符串的長度:
  • len 的值;
  • 字符串長度減去 pos 的值。

說得簡單一些,待刪除字符串最多只能刪除到字符串結尾。

三. 提取子字符串

substr() 函數用於從 string 字符串中提取子字符串,它的原型為:

string substr (size_t pos = 0, size_t len = npos) const;

pos 為要提取的子字符串的起始下標,len 為要提取的子字符串的長度。

請看下面的代碼:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1 = "first second third";
    string s2;
    s2 = s1.substr(6, 6);
    cout<< s1 <<endl;
    cout<< s2 <<endl;
    return 0;
}
運行結果:
first second third
second

系統對 substr() 參數的處理和 erase() 類似:
  • 如果 pos 越界,會拋出異常;
  • 如果 len 越界,會提取從 pos 到字符串結尾處的所有字符。

四. 字符串查找

string 類提供了幾個與字符串查找有關的函數,如下所示。

1) find() 函數

find() 函數用於在 string 字符串中查找子字符串出現的位置,它其中的兩種原型為:

size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;

第一個參數為待查找的子字符串,它可以是 string 字符串,也可以是C風格的字符串。第二個參數為開始查找的位置(下標);如果不指明,則從第0個字符開始查找。

請看下面的代碼:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1 = "first second third";
    string s2 = "second";
    int index = s1.find(s2,5);
    if(index < s1.length())
        cout<<"Found at index : "<< index <<endl;
    else
        cout<<"Not found"<<endl;
    return 0;
}
運行結果:
Found at index : 6

find() 函數最終返回的是子字符串第一次出現在字符串中的起始下標。本例最終是在下標6處找到了 s2 字符串。如果沒有查找到子字符串,那麼會返回一個無窮大值 4294967295。

2) rfind() 函數

rfind() 和 find() 很類似,同樣是在字符串中查找子字符串,不同的是 find() 函數從第二個參數開始往後查找,而 rfind() 函數則最多查找到第二個參數處,如果到了第二個參數所指定的下標還沒有找到子字符串,則返回一個無窮大值4294967295。

請看下面的例子:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1 = "first second third";
    string s2 = "second";
    int index = s1.rfind(s2,6);
    if(index < s1.length())
        cout<<"Found at index : "<< index <<endl;
    else
        cout<<"Not found"<<endl;
    return 0;
}
運行結果:
Found at index : 6

3) find_first_of() 函數

find_first_of() 函數用於查找子字符串和字符串共同具有的字符在字符串中首次出現的位置。請看下面的代碼:
#include <iostream>
#include <string>
using namespace std;

int main(){
    string s1 = "first second second third";
    string s2 = "asecond";
    int index = s1.find_first_of(s2);
    if(index < s1.length())
        cout<<"Found at index : "<< index <<endl;
    else
        cout<<"Not found"<<endl;
    return 0;
}
運行結果:
Found at index : 3

本例中 s1 和 s2 共同具有的字符是 ’s’,該字符在 s1 中首次出現的下標是3,故查找結果返回3。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved