四、關於c++的複合類型(二)

字符串

1.什麼是字符串?字符串是存儲在內存的連續字節中的一系列字符,C++處理字符串有兩種方式:一種來自C語言,稱爲C-風格字符串,另一種是基於string類庫的方法

2.存儲在內存的連續字節中的一系列字符意味着可以存儲在char數組當中,而對於C-風格字符串具有一種特質:以空字符串'\0'結尾

    如:

   char a[5] = {'a','b','c','d','e'};  //不是一個字符串,不以\0結尾

   char a[5] = {'a','b','c','d','\0'}; //是字符串,以\0結尾

   但兩個都是char數組

3.在2點中,數組初始化的方法看起來很冗長乏味,使用大量單引號,還需要記住結尾的空字符。下面介紹另一種簡單的將字符數組初始化爲字符串的方法:

char a[11] =  "Hello World";  //注意雙引號,結尾隱式包含空字符,不用顯式包含它

char a[] = "Hello World";

也可以使用鍵盤輸入,將字符串讀到char數組中,也會自動添加結尾的空字符

4.使用字符數組存儲字符串需要保證數組空間足夠大,能存儲字符串(空字符也應該計算進去)

   char a[5] = "Hello";  //編譯出錯,因爲加上空字符,字符串長度是6,而數組長度只有5

   char a[] = "Hello";

    sizeof(a);  //6,Hello 5  + \0 1 = 6

    char a[11] = "Hello";

    sizeof(a); // 11,顯示的是數組的大小

5.注意''和""

   'S'與"S"

   'S'是字符常量,接觸過ASCLL碼的人知道,S的ASCLL是83,'S'其實就是83的另一種寫法

  char a = 'S';// 其實是將83賦值給a

  "S"不是字符常量,它是兩個字符('S'和'\0')組成的字符串,而且"S"其實表示的是該字符串所在的內存地址

  char a = "S"; //是錯誤的,將一個地址賦給char類型

6.sizeof運算符與strlen()函數

   char a[10] = "Hello";

   sizeof(a);   //10,數組的長度

   strlen(a); //5,計算可見的字符,不把空字符計算在內,需要包含cstring頭文件

7.字符串輸入

7.1cin輸入:由於不能通過鍵盤輸入空字符,因此cin需要通過別的辦法判斷字符串的結尾位置,cin使用空白(空格、製表符、換行符)來確定字符串的結束位置,這意味着cin在獲取字符數組輸入時只能讀取一個單詞,讀取單詞後將它放進數組中,並自動在結尾添加空字符,但現實中往往不只讀取一個單詞,可能是多個單詞中間以空格隔開組成的字符串。

7.2每次讀取一行輸入

iostream中的類(如cin)提供了一些面向行的類成員函數:getline()和get(),這兩個函數都讀取一行輸入直到到達換行符。

7.2.1getline()

調用方法:cin.getline(),該函數有兩個參數,第一個參數是用來存儲輸入行的數組的名稱,第二個參數是要讀取的字符數(如果這個參數是20,最多輸入19,剩下的空間用於存儲自動在結尾添加的空字符),getline()在讀取指定數目的字符或遇到換行符停止讀取

char a[20];

cout<<"請輸入字符串:";

cin.getline(a,19);//讀取的時候會把換行符也讀取進去來判斷行尾,然後存儲時用空字符代替換行符

7.2.2get()

istream類中,該函數有幾種變體,其中一種和getline()的使用類似,接收參數一樣,並且都讀到行尾,但是,不同的是get()不會讀取換行符,並替換成空字符,還把換行符留在輸入隊列裏,幸運的是,get()有一種變體,不帶任何參數,調用讀取下個字符,可以用它處理換行符,爲下一行讀取做準備。

char a[20];

cout<<"請輸入字符串:";

cin.get(a,19);

cin.get(); //處理換行符

//也可以寫成 cin.get(a,19).get()  因爲cin.get(a,19)返回一個cin對象,又可以調用get方法

7.2.3優先使用get()

首先,老式實現沒有getline();再者,get()輸入更仔細。假如get將一行讀入數組中,如何知道停止讀取的原因是由於已經讀取整行還是由於數組已經填滿?查看下一個輸入字符,如果是換行符說明已經讀取了整行,如果不是,說明該行還有其他輸入可是數組已經填滿。

7.2.4如果使用cin>>輸入字符串(只輸入一個單詞),然後回車,此時回車鍵產生的換行符將影響下面的行的輸入,可以使用cin.get()接收這個換行符

cin>>a;

cin.get();

等價於

(cin>>a).get();  //cin>>a返回一個cin對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章