C++之字符串總結

1.字符串聲名

字符串是存儲在內存的連續字節中的一系列字符。C++處理字符串的方式有兩種。第一種來自C語言,常被稱爲C風格字符串(C- style string)。另一種基於 string類庫的方法。

存儲在連續字節中的一系列字符意味着可以將字符串存儲在char數組中,其中每個字符都位於自己的數組元素中。C風格字符串具有一種特殊的性質:以空字符( null character)結尾,空字符被寫作\0,其 ASCII I碼爲0,用來標記字符串的結尾。例如,請看下面兩個聲明

char dog[8]={'b','e','a','u',' ','I','i'};       // not a string!
char dog[8]={'f','a','t','e','s','s','a','\0'};   // a string!

這兩個數組都是char數組,但只有第二個數組是字符串。空字符對C風格字符串而言至關重要。例如C++有很多處理字符串的函數,其中包括cout使用的那些函數。它們都逐個地處理字符串中的字符,直到達空字符爲止。如果使用cout顯示上面的cat這樣的字符串,則將顯示前7個字符,發現空字符後停止但是,如果使用cout顯示上面的dog數組(它不是字符串),cout將打印出數組中的8個字母,並接着內存中隨後的各個字節解釋爲要打印的字符,直到遇到空字符爲止。由於空字符(實際上是被設置爲0的字節)在內存中很常見,因此這一過程將很快停止。但儘管如此,還是不應將不是字符串的字符數組當作字符串處理。

  • 字符串的簡化定義

只需使用一個用引號括起的字符串即可,這種字符串被稱爲字符串常量( string constant)或字符串字面值( string literal),如下所示:

char bird[11] = "Mr. Cheeps"; 
char fish[] = "Bubbles";

用引號擴起的字符串隱式的包括了結尾的空字符(’\0’),當然,應確保數組足夠大,能夠存儲字符串中所有字符—包括空字符。使用字符串常量初始化字符數組是這樣的一種情況,即讓編譯器計算元素數目更爲安全。讓數組比字符串長沒有什麼害處,只是會浪費一些空間而已。這是因爲處理字符串的函數根據空字符的位置,而不是數組長度來進行處理。C++對字符串長度沒有限制

注意,字符串常量(使用雙引號)不能與字符常量(使用單引號)互換。字符常量(如’S’)是字符串編碼的簡寫表示。在ASCⅡ系統上,'S’只是83的另一種寫法,因此,下面的語句將83賦給shirt_size

char shirt_size = 's';      // that's fine

但"S"不是字符常量,它表示的是兩個字符(字符S和\0)組成的字符串。更糟糕的是,"S"實際表示是字符串所在的內存地址,因此下面的語句試圖將一個內存地址賦給shirt_size;

char shirt_size = "S";  // illegal type mismatch

2.面向行的輸入

1、cin.getline()

getline()函數讀取整行,它使用通過回車鍵輸入的換行符來確定輸入結尾。要調用這種方法,可以使用 cin.getline()。該函數有兩個參數。第一個參數是用來存儲輸入行的數組的名稱,第二個參數是要讀取的字符數。如果這個參數爲20,則函數最多讀取19個字符,餘下的空間用於存儲自動在結尾處添加的空字符。 getline()成員函數在讀取指定數目的字符或遇到換行符時停止讀取。例如,假設要使用 getline()將姓名讀入到一個包含20個元素的name數組中。可以使用這樣的函數調用:

cin.getline(name,20)

getline()函數每次讀取一行。它通過換行符來確定行尾,但不保存換行符。相反,在存儲字符串時,它用空字符來替換換行符(參見圖4.5)

2、cin.get()

我們來試試另一種方法。 Istream類有另一個名爲get()的成員函數,該函數有幾種變體。其中一種變體的工作方式與 getline()類似,它們接受的參數相同,解釋參數的方式也相同,並且都讀取到行尾。但get並不再讀取並丟棄換行符,而是將其留在輸入隊列中。假設我們連續兩次調用get():

cin.get(name,ArSize);
cin.get(dessert,ArSize); // a problem

由於第一次調用後,換行符將留在輸入隊列中,因此第二次調用時看到的第一個字符便是換行符。因此get()認爲已到達行尾,而沒有發現任何可讀取的內容。如果不藉助於幫助,get()將不能跨過該換行符幸運的是,get()有另一種變體。使用不帶任何參數的 cin.get()調用可讀取下一個字符(即使是換行符),因此可以用它來處理換行符,爲讀取下一行輸入做好準備。也就是說,可以採用下面的調用序列:

cin.get(name,ArSize);        //read first line
cin.get()                    //read new line
cin.get(dessert,Arsize);     // read second line

另一種使用get()的方式是將兩個類成員函數拼接起來(合併),如下所示:

cin.get(name,ArSize).get();   //concatenate member functions

之所以可以這樣做,是由於 cin. get(name, AsSize)返回一個cin對象,該對象隨後將被用來調用get()函數。同樣,下面的語句將把輸入中連續的兩行分別讀入到數組name1和name2中,其效果與兩次調用cin.getline()相同

cin.getline(naem1,ArSize).getline(name2,ArSize)

3.string類簡介

ISO/ANSI C++98標準通過添加 string類擴展了C++庫,因此現在可以 string類型的變量(使用C+的話說是對象)而不是字符數組來存儲字符串。您將看到, string類使用起來比數組簡單,同時提供了將字符串作爲一種數據類型的表示方法。要使用 string類,必須在程序中包含頭文件 string。 string類位於名稱空間std中,因此您必須提供一條using編譯指令,或者使用std::string來引用它。 string類定義隱藏了字符串的數組性質,讓您能夠像處理普通變量那樣處理字符串。

string str1;      //creat an empty string object
string str2 = "panther";   //creat an initialized string

類設計讓程序能夠自動處理 string的大小。例如,strl的聲明創建一個長度爲0的 string對象,但程序將輸入讀取到sr1中時,將自動調整strl的長度:

cin >> str1;    //str1 resized to fit input

這使得與使用數組相比,使用 string對象更方便,也更安全。從理論上說,可以將char數組視爲一組用於存儲一個字符串的char存儲單元,而 string類變量是一個表示字符串的實體。

3.1 C++11 字符串初始化

char first_data[] = {"le Charpin Dodu"};
char second_data[] {"The Elegant Plate"};
string third_data = {"The Bread Bowl"};
string fourth_data {"Hank Fine Eats"};

3.2 賦值、拼接和附加

使用 string類時,某些操作比使用數組時更簡單。例如,不能將一個數組賦給另一個數組,但可以將一個 string對象賦給另一個 string對象:

char charrl[20];     //create an empty array 
char charr2[20]="jaguar";  //create an initialized array
string str1;         //create an empty string object 
string str2 ="panther";   //create an initialized string 
charr1 = charr2;    //INVALID, no array assignment
strl = str2;       //VALID, object assignment ok

string類簡化了字符串合併操作,可以使用運算符+將兩個string對象合併起來,還可以使用運算符符串+=附加到 string對象的末尾。繼續前面的代碼,可以這樣做:

sting str3;
str3 = str1 + str2;     //assign str3 the joined strings
str1 += str2;         // add str2 to the end of str1

3.3 string 其他操作

在C++新增 string類之前,程序員也需要完成諸如給字符串賦值等工作。對於C風格字符串程序員使用C語言庫中的函數來完成這些任務。頭文件 cstring(以前爲 string. h)提供了這些函數。例如,可以使用函數 strcpy()將字符串複製到字符數組中,使用函數 strcat()將字符串附加到字符數組末尾:

strcpy(charr1,charr2);   //copy charr2 to charr1
strcat(charr1,charr2);   //append contents of charr2 to charr1
strlen(charr1);          // return the length of charr1

string類提供了一系列針對字符串的操作

1.append()-- 在字符串的末尾添加字符

2.find()–在字符串中查找字符串

3.insert()–插入字符

4.length()–返回字符串的長度

5.replace()–替換字符串

6.substr()–返回某個字符串

#include <iostream>
#include <string>
using namespace std;

int main()
{
    //定義一個string類對象
    string http = "www.runoob.com";

   //打印字符串長度
   cout<<http.length()<<endl;

    //拼接
    http.append("/C++");
    cout<<http<<endl; //打印結果爲:www.runoob.com/C++

    //刪除
    int pos = http.find("/C++"); //查找"C++"在字符串中的位置
    cout<<pos<<endl;
    http.replace(pos, 4, "");   //從位置pos開始,之後的4個字符替換爲空,即刪除
    cout<<http<<endl;

    //找子串runoob
    int first = http.find_first_of("."); //從頭開始尋找字符'.'的位置
    int last = http.find_last_of(".");   //從尾開始尋找字符'.'的位置
    cout<<http.substr(first+1, last-first-1)<<endl; //提取"runoob"子串並打印

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