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