精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C 之string學習筆記(1)

====================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之比較==================== 

  • 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[]數組
    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)

  這個函數的運作機理很簡單:

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

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

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

  這樣就對了,輸出如下:

      但是值得說明的一點就是,雖然使用了strcmp函數簡化了程序代碼,但是在簡化也不如string類的字符串,我們可以看到在程序的第13行,直接比較就行了。這是因為string類中的函數已經重載了比較運算符(==,>,<)。因此string類就允許使用運算符直接對他的字符串對象進行比較。

  • string型字符串可以直接賦值,而char不行。如果我們在程序中有下面這段話,則編譯器肯定是會報錯的:
    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所能容納的字符長度,而去修改了其他地址的數據,這樣程序自然而然就崩潰了。


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

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

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


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

      學習筆記1 到此結束,^_^......


本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++的輸入輸出流、文件操作
std::string的用法
C++ String
C學習心得
詳細解說STL string -- STLDetailString
C++字符串與指針
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 天台县| 如皋市| 牡丹江市| 江口县| 潮州市| 宜川县| 鄂托克前旗| 信宜市| 德江县| 鸡东县| 华亭县| 无棣县| 饶阳县| 崇州市| 彰化县| 定陶县| 鄄城县| 横山县| 乌兰浩特市| 攀枝花市| 土默特右旗| 卢龙县| 嘉荫县| 梨树县| 隆安县| 兴义市| 青龙| 黑河市| 定州市| 出国| 凯里市| 秀山| 兴城市| 耒阳市| 衡南县| 肇源县| 英超| 洪泽县| 中卫市| 周口市| 桦甸市|