C++基礎程式設計----2.2標準庫型別string
標準庫型別string
標準庫型別string是一個可變長的字元序列。
使用string型別必須包含string標頭檔案,string定義在名稱空間std中,使用string類,必須包含以下程式碼:
#include<string>
using std::string // string定義在名稱空間std中
建議:我們應該儘可能的使用標準類庫,因為它對於一般應用場合來說有足夠的效率,程式碼健壯性強
1.定義和初始化string物件
1.1 如何初始化類的物件是由這個類本身決定的,一個類可以定義很多種初始化物件的方式,但方式之間有所區別:要麼型別不同,要麼引數不同
1.2 初始化物件的方式
string s1; // 預設初始化,s1是個空字串
string s2(s1); // s2是s1的副本
string s2=s1; // 等價於s2(s1),s2是s1的副本
string s3("value"); // s3是字面值value的副本,不包含value後的那個空字元
string s4(10,'c'); // s4初始化為10個連續的c組成的串
1.3 直接初始化和拷貝初始化
string s3("value"); // 直接初始化
string s4(10,'c'); // 直接初始化
string s2=s1; // 拷貝初始化,呼叫拷貝建構函式 其中的引數為const string &型別
2.string物件的操作
cin>>s; cout<<s; s[n]
s1==s2; s1=s2; s1!=s2; s1+=s2; < <= > >= // 運算子過載,儘量類似內建型別(計算機硬體能識別的型別,如int,char等)的規則
s.empty() // s為空返回真 返回值為bool型別
s.size(); // 返回s字串字元的個數,返回型別為size_type型別
2.1 使用getline讀取一整行
有時候我們希望字串中保留輸入時的空格字元(cin>>s不能輸出空格),應該使用getline替代原來的>>運算子,getline函式引數一個為輸入流,一個是string類物件
2.2 string::size_type型別
s.size(); // 返回s字串字元的個數,返回型別為size_type型別
size_type型別是在string中定義的,它是一個無符號整型型別,因此切記在表示式中混用帶符號和無符號數可能產生意想不到的後果,例如假設n是一個int型負數,s.size()<n可以幾乎肯定是true,因為負數會自動轉換為比較大的無符號的值
2.3 比較string物件、為string物件賦值、字面值和string物件相加 類似於內建型別的運算
(2)、注意:由於C++要與C進行相容,所以字串字面值並不是string類的物件,字串字面值和string是不同型別,舉例:
string s7="hello"+", "+s1; // 錯誤,不能將字面值進行直接相加
string s7="hello"+s1+“world”; // 正確, string s7=("hello"+s1)+“world”; "hello"+s1的結果是string臨時物件
3.處理string物件中的字元
我們經常單獨處理string物件的字元,比如檢查一個string物件是否包含空白,或者把string物件中的小寫變成大寫,再或者特定的字元是否出現等等,處理這類問題的關鍵就是在於如何獲取字元本身。來看看cctype標頭檔案定義的標準庫函式處理這類問題:
isalnum(c); // c為字母或者數字時,為真
isdigit(c); // c是數字時,為真
isalpha(c); // c是字母時,為真
isspace(c); // c是空格時,為真
islower(c); // c是小寫字母時,為真
isupper(c); // c是大寫字母時,為真
toupper(c); // 若c是小寫字母,輸出對應的大寫字母,否則原樣輸出
tolower(c); // 若c是大寫字母,輸出對應的小寫字母,否則原樣輸出
3.1處理每個字元?使用基於範圍的for語句
C++11新標準提供了一種語句:範圍for語句。(vs2010不支援,因為範圍for語句推出時間是2011年),這種語句遍歷給定序列中的每個元素,並對某個值進行操作,其語法形式:
string str("some string");
for(auto c:str) auto c 也可以直接換成 auto &c(引用),這樣對c的操作可以改變str中字元的值
cout<<c<<endl;
3.2 只處理一部分字元?
(1)想訪問字串中單個字元:一種是使用下標,另一種是使用迭代器(在以後章節中陸續介紹)
(2)下標運算子[]:
接受輸入引數為string:size_type型別的值,這個引數表示訪問字元的位置,返回值為該位置字元的引用
(3) string物件的下標必須大於等於0,小於size(),超出範圍的下標將產生不可預知的結果。
(4) 程式碼健壯性:
(1) if(!s.empty()) // 先判斷s不為空,再進行輸出
cout<<s[0]<<endl;
(2) for(decltype(s.size()) index=0; //處理s中字元,直至我們處理完成或者遇到一個空白結束
index !=s.size()&&!isspace(s[index]); ++index)
s[index]=toupper(s[index]);
(5) 檢查下標是否合法性
C++標準並沒有要求標準庫檢查合法性,因此自己使用的時候,這個地方一定注意。
(6) 使用下標可以隨機進行訪問
舉例:
想要編寫程式把0到15之間的十進位制數轉換為對應的十六進位制形式
const string hexdigits="0123456789ABCDEF"; // 可能的十六進位制數字
cout<<"Enter a series of numbers between 0 and 15"<<endl;
string result; // 用於儲存十六進位制的字串
string::size_type n; // 輸入流中讀數
while(cin>>n)
if(n<hexdigits.size()) // 忽略無效輸入
result +=hexdigits[n];
cout<<"Your hex number is:"<<result<<endl;