C++標準庫string類型那些事兒

string 類型支持長度可變的字符串,C++ 標準庫將負責管理與存儲字符相關的內存,以及提供各種有用的操作。標準庫 string 類型的目的就是滿足對字符串的一般應用。

一、string對象的定義和初始化

 

 

string標準庫支持幾個構造函數。構造函數是一個特殊成員函數,定義如何初始化該類型的對象。幾種初始化方式如下代碼:
 
#include <iostream>
#include<string>
#include<cctype>
 
using namespace std;
 
int main()
{
    char cp[]="as1254884adas";
    string a;//默認構造函數a爲空串
    string a1("12345p->=");//將a1初始化爲一個字符串字面值副本
    string a2(a1);//將a2初始化爲a1的一個副本
    string a3(5,'a');//將a3初始化爲字符'a'的5個副本
    string a4(cp,5);//創建一個 string 對象,它被初始化爲 cp 所指向數組的前 5 個元素的副本
    string a5(a1,3);//創建一個 string 對象,它被初始化爲一個已存在的 string 對象 a1 中從下標 3 開始的字符的副本
    //函數原型:string a6(a1, pos2, len2   創建一個 string 對象,它被初始化爲 a1 中從下標 pos2 開始的 len2 個字符的副本。
    //如果 pos2 > a1.size(),則該操作未定義,無論 len2 的值是多少,最多隻能複製 a1.size() - pos2 個字符
    string a6(a1,2,3);
    cout<<a<<endl;
    cout<<a1<<endl<<a2<<endl<<a3<<endl<<a4<<endl;
    cout<<a5<<endl<<a6<<endl;
    return 0;
}

 

二、string對象的讀寫

我們可以用 iostream 和 string 標準庫,使用標準輸入輸出操作符來讀寫 string 對象,和內置類型的輸入操作(cin>>s)一樣,string 的輸入操作符也會返回所讀的數據流。因此,可以把輸入操作作爲判斷條件,請注意:從標準輸入讀取 string 並將讀入的串存儲在 s 中,讀取並忽略開頭所有的空白字符(如空格,換行符,製表符)。讀取字符直至再次遇到空白字符,讀取終止。

當然,我們還可以使用getline函數讀取整行文本,這個函數接受兩個參數:一個輸入流對象和一個 string 對象。getline 函數從輸入流的下一行讀取,並保存讀取的內容到不包括換行符。和輸入操作符不一樣的是,getline 並不忽略行開頭的換行符。只要 getline 遇到換行符,即便它是輸入的第一個字符,getline 也將停止讀入並返回。如果第一個字符就是換行符,則 string 參數將被置爲空 string。

代碼如下:

#include <iostream>
#include<string>
#include<cctype>
 
using namespace std;
 
int main()
{
    string line,s;
    if(cin>>s)
        cout<<"s:"<<s<<endl;
    if(getline(cin,line))
        cout<<"line:"<<line<<endl;
    return 0;
}

 

三、string對象的常用操作

==,!=, <, <=, >, 和 >=保持這些操作符的含義,需要說明的是:string 對象比較操作是區分大小寫的,即同一個字符的大小寫形式被認爲是兩個不同的字符。在多數計算機上,大寫的字母位於小寫之前:任何一個大寫之母都小於任意的小寫字母。下面探討下string的size和empty操作。

1.size函數和empty函數

empty函數用於判斷string對象是否爲空,其函數返回值爲bool值。

size函數獲取string對象中字符的個數(size與0比較也可以判斷是否爲空),常應用於下標尋尋值操作。從邏輯上來講,size()函數似乎應該返回整形數值(也可以賦值給int類型),但事實上,size 操作返回的是 string::size_type 類型的值。使用 int 變量的另一個問題是,有些機器上 int 變量的表示範圍太小,甚至無法存儲實際並不長的 string 對象。如在有 16 位 int 型的機器上,int 類型變量最大隻能表示 32767 個字符的 string 個字符的 string 對象。而能容納一個文件內容的 string 對象輕易就會超過這個數字。因此,爲了避免溢出,保存一個 stirng 對象 size 的最安全的方法就是使用標準庫類型 string::size_type。

下面是string對象字符的處理函數(c爲單個字符,可用string下標表示):

isalnum(c)

如果 c 是字母或數字,則爲 True

isalpha(c)

如果 c 是字母,則爲 true

iscntrl(c)

如果 c 是控制字符,則爲 true 

isdigit(c)

如果 c 是數字,則爲 true

isgraph(c)

如果 c 不是空格,但可打印,則爲 true

islower(c)

如果 c 是小寫字母,則爲 true

isprint(c)

如果 c 是可打印的字符,則爲 true

ispunct(c)

如果 c 是標點符號,則 true

isspace(c)

如果 c 是空白字符,則爲 true

isupper(c)

如果 c 是大寫字母,則 true

isxdigit(c)

如果是 c 十六進制數,則爲 true

tolower(c)

如果 c 大寫字母,返回其小寫字母形式,否則直接返回 c

toupper(c)

如果 c 是小寫字母,則返回其大寫字母形式,否則直接返回 c

 

 

相關代碼:
#include <iostream>
#include<string>
#include<cctype>

using namespace std;

int main()
{
    char cp[]="as1254884adas";
    string a;//默認構造函數a爲空串
    string a1("12345p->=");//將a1初始化爲一個字符串字面值副本
    string a2(a1);//將a2初始化爲a1的一個副本
    string a3(5,'a');//將a3初始化爲字符'a'的5個副本
    string a4(cp,5);//創建一個 string 對象,它被初始化爲 cp 所指向數組的前 5 個元素的副本
    cout<<a4.empty()<<endl;//如果 a4 爲空串,則返回 true,否則返回 false。
    cout<<a1.size()<<endl;//返回 a1 中字符的個數
    cout<<a1[1]<<endl; //返回 a1 中位置爲 n 的字符,位置從 0 開始計數
    //把 a1 和a3 連接成一個新字符串,返回新生成的字符串。
    //當然也可以和字符串字面值相連接,即:a1+"sdasd";
    cout<<(a1+a3)<<endl;
    a1=a3;          //把 a1 內容替換爲 a3 的副本
    cout<<a1<<endl;
    cout<<(a1==a3)<<endl;
    string::size_type i=0;
    for(;i<a1.size();++i)
    {
        cout<<a1[i]<<endl;
    }
    cout<<i<<endl; 
    
    return 0;
}

 

2. compare函數比較大小操作

操作符逐個字符地進行比較,直到比較到某個位置上,兩個 string 對象對應的字符不相同爲止。string 對象的整個比較依賴於不相同字符之間的比較。如果第一個不相等的字符是‘e’和‘o’。由於在英文字母表中,‘e’出現得比‘o’早(即‘e’小於‘o’),於是“abend”小於“abort”。如果要比較的兩個 string 對象長度不相同,而且一個 string 對象是另一個 string 對象的子串,則較短的 string 對象小於較長的 string 對象。compare函數實現的字典順序比較與以上相同。

compare函數返回下面列出的三種可能值之一:

2.1. 正數,此時 s1 大於 args 所代表的 string 對象。

2.2. 負數,此時 s1 小於 args 所代表的 string 對象。

2.3. 0,此時 s1 恰好等於 args 所代表的 string 對象。

下面是compare的一些重載函數:

s.compare(s2)

比較 s 和 s2

 s.compare(pos1, n1, s2)

讓 s 中從 pos 下標位置開始的 n1 個字符與 s2 做比較

 s.compare(pos1, n1, s2, pos2, n2)

讓 s 中從 pos1 下標位置開始的 n1 個字符與 s2 中從 pos2 下標位置開始的 n2 個字符做比較

s.compare(cp)

比較 s 和 cp 所指向的以空字符結束的字符串

 s.compare(pos1, n1, cp)

讓 s 中從 pos1 下標位置開始的 n1 個字符與 cp 所指向的字符串做比較

 s.compare(pos1, n1, cp, n2)

讓 s 中從 pos1 下標位置開始的 n1 個字符與 cp 所指向的字符串的前 n2 個字符做比較

 

3.string的查找操作

string 類提供了 6 種查找函數,每種函數以不同形式的 find 命名。這些操作全都返回 string::size_type 類型的值,以下標形式標記查找匹配所發生的位置;或者返回一個名爲 string::npos 的特殊值,說明查找沒有匹配。string 類將 npos 定義爲保證大於任何有效下標的值。

s.find( args)

在 s 中查找 args 的第一次出現

s.rfind( args)

在 s 中查找 args 的最後一次出現

s.find_first_of( args)

在 s 中查找 args 的任意字符的第一次出現

s.find_last_of( args)

在 s 中查找 args 的任意字符的最後一次出現

s.find_first_not_of( args)

在 s 中查找第一個不屬於 args 的字符

s.find_last_not_of( args)

在 s 中查找最後一個不屬於 args 的字符

string類型提供的find操作的參數args:

c, pos

在 s 中,從下標 pos 標記的位置開始,查找字符 c。pos 的默認值爲 0

s2, pos

在 s 中,從下標 pos 標記的位置開始,查找 string 對象 s2。pos 的默認值爲 0

cp, pos

在 s 中,從下標 pos 標記的位置形參,查找指針 cp 所指向的 C 風格的以空字符結束的字符串。pos 的默認值爲 0

cp, pos, n

在 s 中,從下標 pos 標記的位置開始,查找指針 cp 所指向數組的前 n 個字符。pos 和 n 都沒有默認值

 

4.append 和 replace 函數

string 類型提供了 6 個 append 重載函數版本和 10 個 replace 版本。append 和 replace 函數使用了相同的參數集合實現重載。用於指定在 string 對象中添加的字符。對於 append 操作,字符將添加在 string 對象的末尾。而 replace 函數則將這些字符插入到指定位置,從而替換 string 對象中一段已存在的字符。

s.append( args)

將 args 串接在 s 後面。返回 s 引用

s.replace(pos, len, args)

刪除 s 中從下標 pos 開始的 len 個字符,用 args 指定的字符替換之。返回 s 的引用

s.replace(b, e, args)

刪除迭代器 b 和 e 標記範圍內所有的字符,用 args 替換之。返回 s 的引用

 

各個參數操作:

s2

string 類型的字符串 s2

s2, pos2, len2

字符串 s2 中從下標 pos2 開始的 len2 個字符

cp

指針 cp 指向的以空字符結束的數組

cp, len2

cp 指向的以空字符結束的數組中前 len2 個字符

n, c

字符 c 的 n 個副本

b2, e2

迭代器 b2 和 e2 標記的範圍內所有字符

 

5.子串操作

s.substr(pos, n)

返回一個 string 類型的字符串,它包含 s 中從下標 pos 開始的 n 個字符

s.substr(pos)

返回一個 string 類型的字符串,它包含從下標 pos 開始到 s 末尾的所有字符

s.substr()

返回 s 的副本

 

 

關於string支持的容器操作詳情,請查看下篇文章。。。。。。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章