最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的字符串(1)

 更新時間:2021年11月03日 10:58:15   作者:梁唐  
這篇文章主要簡單介紹C++中的字符串,字符串就是連續(xù)的一連串字符,在C++當(dāng)中, 處理字符串的方式有兩種類型。一種來自于C語言,也被稱為C風(fēng)格字符串。另外一種是基于string類庫,下面來看文章學(xué)校內(nèi)容

1、字符串

1.1 字符串定義

字符串就是連續(xù)的一連串字符,在C++當(dāng)中, 處理字符串的方式有兩種類型。一種來自于C語言,也被稱為C風(fēng)格字符串。另外一種是基于string類庫。

C風(fēng)格的字符串其實就是字符存儲在char數(shù)組當(dāng)中。不過它和一般的數(shù)組有一些區(qū)別,擁有一些特殊的性質(zhì)。比如一空字符\0結(jié)尾,它的ascii碼是0,用來標(biāo)記字符串的結(jié)尾。

char str[5] = {'h', 'e', 'l', 'l', 'o'};
char str2[5] = {'h', 'e', 'l', 'l', '\0'};


對于上面的兩個例子,第一個例子雖然也是char數(shù)組,但是由于它的結(jié)尾不是\0,所以它不能看成是字符串。因為很多算法都是以\0的位置為標(biāo)記的,比如計算字符串長度的算法,以及cout等等。

上面我們采用的是數(shù)組常規(guī)的初始化方式,這當(dāng)然是可以的,不過這樣會很不方便。一個是需要一位一位地填寫字符,會非常地麻煩。另外還需要手動填充\0,也容易忘記,

所以對于字符串而言我們還有更好的初始化方式:

char hello[6] = "hello";
char world[] = "world";


用引號括起來的字符串隱式地包含了結(jié)尾的\0,需要注意的是,我們在確定數(shù)組長度的時候需要將結(jié)尾的\0也計算在內(nèi)。

這里要提醒大家注意引號的區(qū)別, 在C++當(dāng)中單引號表示單個字符,而雙引號表示字符串。所以下面這種寫法是錯誤的:

char c = "S";


并且“S”其實表示的是字符串所在的內(nèi)存地址,當(dāng)我們把一個內(nèi)存地址賦值給一個char類型的時候自然就會報錯了。

咦,不是說好的是字符串么,怎么又扯到地址了?不要急,等后面講到指針的地方就明白了。

1.2 字符串的讀入

直接用字符串常量來初始化字符數(shù)組只是一種方式,另外一種常用的方式是只定義字符數(shù)組的長度,從外部讀入數(shù)據(jù),

如:

char str[100];

scanf("%s", str);
cin >> str;

無論是使用scanf還是cin,都是一樣的效果。

但是沒有這么簡單,比如我們再來看一段代碼:

char name[100];
char level[100];

scanf("%s", name);
scanf("%s", level);


在這段代碼當(dāng)中,我們定義了name和level兩個字符串變量。當(dāng)我們執(zhí)行的時候,就會發(fā)現(xiàn)問題:

我剛輸入完名字,還沒來得及輸level就結(jié)束了。如果我們把namelevel分別輸出的話就會發(fā)現(xiàn),name的值是liang,level的值是tang。

這說明了什么?說明了我們讀入字符串的時候它并不是按行讀入的,而是按照空格分隔的!它不像是隔壁的Python,input默認就是讀入一行,C++的讀入默認都是按照空格分隔的。

那問題來了,假如我們需要讀入一行應(yīng)該怎么辦呢?也有辦法,我們可以使用cin.getline代替之前的scanf或者是cin。

我們來看下它的函數(shù)簽名:

istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );


C++允許參數(shù)列表不同的同名函數(shù)重載,這兩個簽名都是OK的。兩者的差別在于第三個參數(shù),但三個參數(shù)表示分隔符,如果不傳的話,默認是'\n'。第二個參數(shù)表示字符串的長度,所以如果要按照行來讀入字符串的話,剛剛的代碼應(yīng)該寫成:

cin.getline(name, 100);
cin.getline(level, 100);


除了可以使用getline之外,還可以使用get。get有好幾種變體,一種變體是讀入一個字符,它有一種變體也可以讀入一行字符串。不過唯一的區(qū)別是,get函數(shù)不會處理行尾的換行符。如果我們要讀入兩行字符的話,需要手動將這個換行符處理掉。

cin.get(name, 100); // 讀入一行數(shù)據(jù)
cin.get();   // 讀入換行符
cin.get(level, 100);// 讀入第二行數(shù)據(jù)


寫成三行看起來有些繁瑣,我們還可以進行簡化,簡化成一行:

cin.get(name, 100).get().get(level, 100);


看起來很像是Java8的流式編程,能夠這樣做的原因是getgetline函數(shù)會返回一個cin的對象。所以我們可以這樣連續(xù)調(diào)用。

相信有些同學(xué)已經(jīng)注意到了,同樣的函數(shù)名,根據(jù)我們傳入的參數(shù)不同執(zhí)行了不同的邏輯。這在C++當(dāng)中叫做函數(shù)重載,是一個非常重要的概念。

1.3 排坑

關(guān)于getline有一個比較大的坑,當(dāng)我們同時使用cingetline的時候,有時候會出現(xiàn)問題。

比如下面這段代碼:

int a;
char name[100];
cin >> a;
cin.getline(name, 100);

cout << "a = " << a << endl;
cout << "name = " << name << endl;


這段代碼很簡單,我們定義了兩個變量。一個是int型的a,一個是字符串name。我們使用cin讀入a,使用getline讀入name。

這看起來一點問題也沒有,但是當(dāng)我們運行的時候就會出現(xiàn)問題。

會發(fā)現(xiàn)我都沒有來得及輸入name,程序就結(jié)束了,而name讀到了一個空。

這并不是C++有bug,而是我們在輸入32的時候,敲了一個回車。所以在使用getline讀入一行的時候,看到了回車,直接退出了,讀入了一個空行,這就是為什么我們沒有機會輸入name的原因。

要解決這個問題怎么辦呢?其實也很簡單,我們額外讀入一個字符,把換行符給讀取掉就行了。

int a;
char name[100];
cin >> a;
cin.get(); // getchar() C語言版本
cin.getline(name, 100);

cout << "a = " << a << endl;
cout << "name = " << name << endl;

類似的問題在競賽的題目當(dāng)中很常見,我們經(jīng)常要同時讀入字符串和數(shù)字,很容易遇到這樣的問題。遇到了不要緊張,仔細檢查一下數(shù)據(jù)和邏輯,看看是不是讀入到了換行符。

到此這篇關(guān)于C++中的字符串(1)的文章就介紹到這了,更多相關(guān)C++字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

注:文章轉(zhuǎn)自微信公眾號:Coder梁(ID:Coder_LT)

相關(guān)文章

  • C++ 名稱空間詳情

    C++ 名稱空間詳情

    當(dāng)一個項目變得大型之后,我們會引入很多的庫,這么一來兩個庫很可能會定義List、Tree、Node同名的類,編譯器要是不考慮這情況的話,程序員調(diào)用時就會出現(xiàn)沖突問題。C++提供了名稱空間工具,以更好的控制名稱的作用域,本文就來談?wù)凜++ 名稱空間,需要的朋友可以參考一下
    2021-09-09
  • C++ 詳細講解stack與queue的模擬實現(xiàn)

    C++ 詳細講解stack與queue的模擬實現(xiàn)

    C++ Stack(堆棧) 是一個容器類的改編,為程序員提供了堆棧的全部功能,也就是說實現(xiàn)了一個先進后出(FILO)的數(shù)據(jù)結(jié)構(gòu),許多程序都使用了 queue 容器。queue 容器可以用來表示超市的結(jié)賬隊列或服務(wù)器上等待執(zhí)行的數(shù)據(jù)庫事務(wù)隊列
    2022-04-04
  • C++中的自定義函數(shù)返回類型

    C++中的自定義函數(shù)返回類型

    這篇文章主要介紹了C++中的自定義函數(shù)返回類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言 自定義類型全面系統(tǒng)理解

    C語言 自定義類型全面系統(tǒng)理解

    在C語言中自定義類型主要有結(jié)構(gòu)體類型、位段、枚舉類型、聯(lián)合體類型,自定義類型是面試常會碰到的內(nèi)容,本篇文章帶你徹底解決自定義類型
    2022-02-02
  • c++ 成員函數(shù)與非成員函數(shù)的抉擇

    c++ 成員函數(shù)與非成員函數(shù)的抉擇

    盡量用類的非成員函數(shù)以及友元函數(shù)替換類的成員函數(shù) 例如一個類來模擬人People
    2013-01-01
  • C++中利用cout和fstream采用非科學(xué)計數(shù)法輸出

    C++中利用cout和fstream采用非科學(xué)計數(shù)法輸出

    這篇文章主要介紹了C++中利用cout和fstream采用非科學(xué)計數(shù)法輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言實現(xiàn)飛機游戲(進階版)的示例代碼

    C語言實現(xiàn)飛機游戲(進階版)的示例代碼

    在前文中,已經(jīng)帶大家利用C語言實現(xiàn)了簡單的飛機游戲,但它還存在一些缺陷。因此,本文將給大家?guī)磉M階版的飛機游戲,需要的可以參考一下
    2022-10-10
  • C語言詳解strcmp函數(shù)的分析及實現(xiàn)

    C語言詳解strcmp函數(shù)的分析及實現(xiàn)

    strcmp函數(shù)語法為“int strcmp(char *str1,char *str2)”,其作用是比較字符串str1和str2是否相同,如果相同則返回0,如果不同,前者大于后者則返回1,否則返回-1
    2022-05-05
  • C++實現(xiàn)LeetCode(15.三數(shù)之和)

    C++實現(xiàn)LeetCode(15.三數(shù)之和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(三數(shù)之和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 從零開始的Socket編程學(xué)習(xí)

    從零開始的Socket編程學(xué)習(xí)

    我們每天打開瀏覽器瀏覽網(wǎng)頁時,瀏覽器的進程怎么與web服務(wù)器通信的?QQ進程怎么與服務(wù)器或你好友所在的QQ進程通信?這些都得靠socket?那什么是socket?socket的類型有哪些?還有socket的基本函數(shù),下面小編帶大家了解下
    2019-05-05

最新評論

武定县| 易门县| 姚安县| 腾冲县| 广东省| 巢湖市| 重庆市| 海南省| 兖州市| 香河县| 吕梁市| 开原市| 宁都县| 民权县| 延安市| 安图县| 抚顺市| 三河市| 望都县| 深州市| 东乌| 青岛市| 宿迁市| 瑞安市| 杭锦后旗| 娄底市| 枣阳市| 防城港市| 长武县| 大厂| 宾川县| 达尔| 武隆县| 襄城县| 徐水县| 叶城县| 顺平县| 资源县| 保山市| 锦州市| 高州市|