====================string類介紹====================
在C++時代,由于誕生了類,出項了一種C++風格的字符串,也就是string型字符串。我們在調用string類來定義字符串的時候,我們必須在程序開頭添加頭文件:
#include <string> |
而且,由于string類存在于命名空間std中,這樣一來,我們就必須使用
using namespace std; |
或者是使用
using std::string; |
才能訪問到string類。string類的好處就是它在定義的時候隱藏掉了字符串的數組性質,因此在使用string類來定義一個字符串的時候我們不需要考慮如何將字符串放在數組中,因為string已經為我們做好了這一步。我們只需要想定義一個變量一樣定義它就行了。我們可以這樣說,由于string是一個類,那么C++就是運用string類的對象來保存字符串的,示例:
string str; |
====================C++的string和C的char之比較====================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> #include <string> using namespace std; int main() { string str= "初始化string型字符串" ; //初始化str char ch[]= "初始化char型字符串" ; //初始化ch[]數組 cout<<str<<endl; cout<<ch<<endl; //string示例 cout<< "請輸入“狗”的英文單詞:" <<endl; cin>>str; if (str== "dog" ) { cout<< "狗:" <<str<<endl; cout<<str<< "的第一個字符是:" <<str[0]<<endl; } else cout<< "輸入錯誤\n" ; //char示例 cout<< "請輸入“豬”的英文單詞:" <<endl; cin>>ch; if (ch== "pig" ) { cout<< "豬:" <<ch<<endl; cout<<ch<< "的第一個字符是:" <<ch[0]<<endl; } else cout<< "輸入錯誤\n" ; return 0; } |
我們一運行程序會發現對于輸入豬的英文pig,就算輸入正確了程序還是會提示輸入錯誤,原因就在于程序的第23行,由于數組ch[]的數組名ch所在的內存地址與“pig”所在的內存地址肯定不一樣,那么無論如何都不會執行程序23行之后的if語句。有圖為證:
以上問題也不是沒有解決方法的,只要我們利用循環的方式來比較數組ch中的每一個字符就可以了。這個check函數我們就不舉例了哈,自己動手,豐衣足食嘛~~~我們還有一種很簡單的方法來比較字符串,即采用:
strcmp (str1,str2) |
這個函數的運作機理很簡單:
這樣一來,我們就可以把程序的第23行改成:
if ( strcmp (ch, "pig" )==0) |
這樣就對了,輸出如下:
但是值得說明的一點就是,雖然使用了strcmp函數簡化了程序代碼,但是在簡化也不如string類的字符串,我們可以看到在程序的第13行,直接比較就行了。這是因為string類中的函數已經重載了比較運算符(==,>,<)。因此string類就允許使用運算符直接對他的字符串對象進行比較。
1 2 3 | char a[]= "Hello,C++" ; char b[]= "Hello,Qt" ; a=b; |
原因就是我們不能把一個數組名直接賦給另外一個數組名,唯一能做的就是對數組元素進行逐個賦值。比如說:
1 2 3 | a[0]=b[0]; a[1]=b[1]; ... |
值得注意的一點是,同上面一樣,雖然我們無法直接賦值,但是我們可以調用strcpy函數來實現賦值的目的:
strcpy (str1,str2); |
這個函數的作用就是把str2中的字符依次復制給str1。值得注意的一點就是,在進行賦值之前,我們必須要保證str1足夠大,以便能夠容納下str2中所有的字符串。所以有了這個函數,我們就可以把上面的程序改一下,把a=b改成strcpy(a,b);就可以了。而如果我們采用string類就不會出現上訴麻煩,因為string類重載了運算符=,這就是的對象之間可以直接賦值。程序和輸出如下圖所示:
string型字符串可以直接合并,但是char型的字符串卻不能直接合并,必須用到strcat函數:
strcat (str1,str2); |
strcat是string catenate的縮寫。它的作用就是將第2個字符串合并到第1個字符串中。因此,第1個字符串必須保證能夠容納下兩個字符串的長度。針對這一點,我們來看如下這個程序:
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> using namespace std; int main() { char a[]= "Hello,C++" ; char b[]= "Hello,Qt" ; strcat (a,b); cout<<a<<endl; cout<<b<<endl; } |
我們一運行程序就崩潰了,產生如下圖所示的錯誤。這就是因為我們在初始化的編譯器自動為數組a設定了長度,為10個字符長(注意,包括‘\0’),而數組b的長度為9個字符長。但是在程序的第8行調用strcat函數的時候,由于b的9個字符長超出了a所能容納的字符長度,而去修改了其他地址的數據,這樣程序自然而然就崩潰了。
char a[20]= "Hello,C++" ; |
而如果我們使用string類的對象來實現兩個字符串合并,就不會產生上訴煩惱,因為string類已經重載了+運算符,示例與輸出結果:
學習筆記1 到此結束,^_^......