小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C 之string學習筆記(1)

 My鏡像站 2011-12-26

====================string類介紹====================

      在C++時代,由于誕生了類,出項了一種C++風格的字符串,也就是string型字符串。我們在調(diào)用string類來定義字符串的時候,我們必須在程序開頭添加頭文件:

#include <string>

      而且,由于string類存在于命名空間std中,這樣一來,我們就必須使用

using namespace std;

  或者是使用

using std::string;

  才能訪問到string類。string類的好處就是它在定義的時候隱藏掉了字符串的數(shù)組性質(zhì),因此在使用string類來定義一個字符串的時 候我們不需要考慮如何將字符串放在數(shù)組中,因為string已經(jīng)為我們做好了這一步。我們只需要想定義一個變量一樣定義它就行了。我們可以這樣說,由于string是一個類,那么C++就是運用string類的對象來保存字符串的,示例:

string str;

====================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型字符串";//初始化str
    char ch[]="初始化char型字符串";//初始化ch[]數(shù)組
    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;
}

  我們一運行程序會發(fā)現(xiàn)對于輸入豬的英文pig,就算輸入正確了程序還是會提示輸入錯誤,原因就在于程序的第23行,由于數(shù)組ch[]的數(shù)組名ch所在的內(nèi)存地址與“pig”所在的內(nèi)存地址肯定不一樣,那么無論如何都不會執(zhí)行程序23行之后的if語句。有圖為證:

      以上問題也不是沒有解決方法的,只要我們利用循環(huán)的方式來比較數(shù)組ch中的每一個字符就可以了。這個check函數(shù)我們就不舉例了哈,自己動手,豐衣足食嘛~~~我們還有一種很簡單的方法來比較字符串,即采用:

strcmp(str1,str2)

  這個函數(shù)的運作機理很簡單:

  • 假如str1<str2,則返回一個小于0的數(shù)字,如-1
  • 假如str1==str2,則返回0
  • 假如str1>str2,則返回一個大于0的數(shù)字,如1

      這樣一來,我們就可以把程序的第23行改成:

if(strcmp(ch,"pig")==0)

  這樣就對了,輸出如下:

      但是值得說明的一點就是,雖然使用了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ù)組元素進行逐個賦值。比如說:

    1
    2
    3
    a[0]=b[0];
    a[1]=b[1];
    ...

          值得注意的一點是,同上面一樣,雖然我們無法直接賦值,但是我們可以調(diào)用strcpy函數(shù)來實現(xiàn)賦值的目的:

    strcpy(str1,str2);

          這個函數(shù)的作用就是把str2中的字符依次復(fù)制給str1。值得注意的一點就是,在進行賦值之前,我們必須要保證str1足夠大,以便能夠容納下str2 中所有的字符串。所以有了這個函數(shù),我們就可以把上面的程序改一下,把a=b改成strcpy(a,b);就可以了。而如果我們采用string類就不會 出現(xiàn)上訴麻煩,因為string類重載了運算符=,這就是的對象之間可以直接賦值。程序和輸出如下圖所示:

  •  string型字符串可以直接合并,但是char型的字符串卻不能直接合并,必須用到strcat函數(shù):

    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;
    }

          我們一運行程序就崩潰了,產(chǎn)生如下圖所示的錯誤。這就是因為我們在初始化的編譯器自動為數(shù)組a設(shè)定了長度,為10個字符長(注意,包括‘\0’),而數(shù)組 b的長度為9個字符長。但是在程序的第8行調(diào)用strcat函數(shù)的時候,由于b的9個字符長超出了a所能容納的字符長度,而去修改了其他地址的數(shù)據(jù),這樣 程序自然而然就崩潰了。

          要想避免這個錯誤,我們就必須自定義數(shù)組a所能容納的最大的大小。反映在程序里面,我們就把程序的第6行修改為:

    char a[20]="Hello,C++";

    而如果我們使用string類的對象來實現(xiàn)兩個字符串合并,就不會產(chǎn)生上訴煩惱,因為string類已經(jīng)重載了+運算符,示例與輸出結(jié)果:


          通過這兩個簡單的例子之間的對比,我們可以很明顯地看出來,C++字符串的合并比C語言的字符串合并更加方便有效,而且不易發(fā)生錯誤。

      學習筆記1 到此結(jié)束,^_^......


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多