C++標准庫string類型的使用和操作總結


  string是C++標准庫最重要的類型之一,string支持長度可變的字符串,其包含在string頭文件中。本文摘自《C++PRIMER 第四版·特別版》和個人的一些總結。

一.聲明和初始化

  聲明前必須在頭文件中包含<string>標准庫,聲明如下:

string     s1;            //聲明一個string對象
string     s2[10];      //聲明一個string對象的數組

  string類型有幾種構造函數,所以其初始化方式也有以下幾種:

string    s1;                                       默認構造函數,s1為空串
string    s2(s1);                                   將s2初始化為s1的一個副本
string    s3("value");                              將s3初始化為一個字符串字面值副本
string    s4(n,'c');                                將s4初始化為字符'c'的n個副本
string    s5(s4.begin(),s4.begin()+s4.size());      將s5初始化為迭代器指向的s4的范圍的內容
string    s6(cp,n);                                 將s6初始為cp指向的數組的前n個元素的副本
string    s7(s6,pos);                               將s7初始化為一個已存在的string對象s6從下標pos開始的字符的副本
string    s8(s7,pos,len);                           將s8初始化為s7從下標pos開始的len個字符的副本,如果pos>s7.size()則操作未定義,無論len為多大,最多只能復制s7.size()-pos個字符

 

二.讀寫操作

  讀寫操作可用標准庫的cin和cout,值得注意到是讀入操作,從標准輸入讀取入string對象時:(1)讀取並忽略開頭的所有空白字符(如空格、換行符、字表符);(2)讀取字符直到再次遇到空白字符,讀取終止。如果輸入"  Hello  World"則屏幕上講輸出"Hello",前后的空白被忽略。

三.常用操作

  下面列出了string對象的常用操作。

 
s.empty();               如果s為空串,則返回true,否則返回false
s.size();                返回s中字符的個數
s[n];                    返回s中位置為n的字符,從0開始計數
s1+s2;                   把s1和s2拼接成一個新的字符串,返回新生成的字符串
s1=s2;                   把s1的內容替換為s2的一個副本
s1==s2;                  比較s1和s2的內容,相等則返回true,否則返回false
!=,<,<=,>和>=     保持這些操作符慣有的含義

  下面說明上面提到的操作值得注意的地方:

  (1)任何存儲string的size操作結果的變量必須為string::size_type類型。特別說明,不要把size的返回值賦值給一個int類型,因為有時int類型的大小不足以裝下size返回的值。

  (2)關系操作符!=,<,<=,>,>=比較兩個對象時采用了和字典排序相同的策略:如果兩個string對象長度不同,且短的對象和長的對象的前面部分相匹配,則短的對象小於長的對象;如果兩個string對象的字符不同,則比較第一個不匹配的字符。如:

/*對於下述代碼有:s1<s2,s2<s3*/
string     s1="Hello";
string     s2="Hello World";
string     s3="Hiya";

  (3)string對象的加法被定義為拼接,如把s2追加到s1的末尾可直接用s1+=s2表達式即可。當需要string對象和字符串混合拼接時,+操作符的左右操作數中必須有一個是string對象。如

string    s1="hello";
string    s2="world";
string    s3=s1+",";             //合法
string    s4="hello"+",";        //非法,+號兩邊都沒有string對象
string    s5=s1+","+"hello";     //合法,s1先和","拼接返回一個string對象,再和"hello"拼接
string    s6="hello"+","+s2;     //非法,"hello"先和","進行+操作,兩個都不是string對象

  (4)由(1)可知,對於string對象的下標操作符的索引(或叫下標)應使用size_type類型,以便於能遍歷整個string對象。如下遍歷取出string對象的所有字符:

for(string::size_type ix=0;ix != s.size();ix++)
    cout<<s[ix]<<endl;

 

四.字符處理

  我們經常要對string對象的單個字符進行處理,在cctype頭文件中包含了各種字符操作函數。下面列出了這些函數:

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
isxdigi(c);            如果c是十六進制,則為true
tolower(c);            返回其小寫字母形式
toupper(c);            返回其大寫字母形式

五.其他操作

1.insert、assign和erase函數

  string類型支持許多容器在操作時都以迭代器為基礎,很多操作函數不同容器都能使用,但是不同的容器也會根據需要對函數進行必要的添加或減少。如string和vector中很多操作都是類似的,很多函數也是相同的。如下面列出了string類型和容器類型共有的操作:

  

s.insert(p,t);            在迭代器p所指向的元素之前插入一個值為t的元素。返回指向新插入元素的迭代器
s.insert(p,n,t);          在迭代器p指向的元素之前插入n個值為t的元素。返回void
s.insert(p,b,e);          在迭代器p所指向的元素之前插入迭代器b和e標記范圍內的所有元素。返回void
s.assign(b,e);            用迭代器b和e標記范圍內的元素替換s。對於string類型,返回s;對於容器類型,返回void
s.assign(n,t);            用n個t替換s。對於string類型,返回s。對於容器類型返回void
s.erase(p);               刪除迭代器p指向的元素。返回一個迭代器,指向被刪除元素后面的元素
s.erase(b,e);             刪除迭代器b和e標記范圍內的元素,返回一個迭代器,指向被刪除元素后面的第一個元素

  下面為string類型特有的操作版本:

s.insert(pos,n,c);                在下標為pos的元素之前插入n個字符c
s.insert(pos,s2);                 在下標為pos的元素之前插入string對象s2的副本
s.insert(pos,s2,pos2,len);        在下標為pos的元素之前插入s2從下標pos2開始的len個字符
s.insert(pos,cp,len);             在下標為pos的元素之前插入cp所指向數組的前len個字符
s.insert(pos,cp);                 在下標為pos的元素之前插入cp所指向的以空字符結束的字符串副本
s.assign(s2);                     用s2的副本替換s
s.assign(s2,pos2,len);            用s2從下標pos開始的len個字符替換s
s.assign(cp,len);                 用cp所指向數組的前len個字符替換s
s.assign(cp);                     用cp所指向的以空字符結束的字符串副本替換s
s.erase(pos,len);                 刪除從下標pos開始的len個字符
/*除非特殊說明,上述所有操作都返回s的引用*/

 

2.append和replace函數

  string類型提供了容器類型不支持的幾種操作:append、replace、substr和一系列find函數。其中append和replace函數用於修改string對象。append操作提供了在字符串尾部插入的捷徑。replace操作用於刪除指定一段范圍內的字符,然后在刪除位置插入一組新字符,等效於調用insert和erase函數。

 /*修改string對象的操作,arg在下表*/
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的引用

  

/*append和replace操作的參數:args*/
s2                       string類型的字符串
s2,pos,lens              字符串s2從下標pos開始的lens個字符
cp                       指針cp指向的以空字符結束的數組
cp,len2                  cp指向的以空字符結束的數組的前len2個字符
n,c                      字符c的n個副本
b2,e2                    迭代器b2和e2標記范圍內的所有字符

 

3.子串操作substr函數

  使用substr操作可以在指定的string對象中檢索需要的子串。

s.substr(pos,n);            返回一個string類型的字符串,它包含從s從下標pos開始的n個字符
s.substr(pos);              返回一個string類型的字符串,它包含從下標pos開始到s的末尾的所有字符
s.substr();                 返回s的副本

 

4.查找操作find函數

  string類提供了6種查找函數,每種函數以不同形式的find命名。這些操作全都返回string::size_type類型的值,以下標的形式返回匹配的位置。當沒有匹配到時返回一個string::npos的特殊值。npos定義為保證大於任何有效的下標值。

  

/*string類型的查找操作,其參數args在下表*/
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的字符

  每個查找都有四個重載版本,如下表:

c,pos                在s中,從下標pos標記的位置開始,查找字符c。pos的默認值為0
s2,pos               在s中,從下標pos標記的位置開始,查找string對象s2。pos的默認值為0.
cp,pos               在s中,從下標pos標記的位置開始,查找指針cp指向的一空字符結束的字符串。pos的默認值為0.
cp,pos,n             在s中,從下標pos標記的位置開始,查找指針cp所指向的數組的前n個字符。pos的默認值為0.

 

5.比較操作compare函數

   compare函數用於實現string類型的字典順序的比價。compare返回下面是三種可能之一:

  (1)正數,此時s1大於args所代表的string對象。

  (2)負數,此時s1小於args所代表的string對象。

  (3)0,相等。

s.compare(s2);                        比較s和s2
s.compare(pos1,n1,s2);                讓s中從pos1下標位置開始的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個字符串比較

 

 

參考文獻

C++ PRIMER》 中文版

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM