string 類型支持長度可變的字符串,C++ 標準庫將負責管理與存儲字符相關的內存,以及提供各種有用的操作。標準庫 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支持的容器操作詳情,請查看下篇文章。。。。。。