天天看點

C++之字元串總結

文章目錄

      • 1.字元串聲名
      • 2.面向行的輸入
      • 3.string類簡介
        • 3.1 C++11 字元串初始化
        • 3.2 指派、拼接和附加
        • 3.3 string 其他操作

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++對字元串長度沒有限制

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

cin.getline(name,20)
           
C++之字元串總結

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

繼續閱讀