文章目錄
-
-
- 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++對字元串長度沒有限制
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbwxCdh1mcvZ2LcV2Zh1Wa9M3clN2byBXLzN3btg3P3pVdC5GT4VlMahWMXFmdJpWUsdmaRxWUUJFbZRVUs1UVRx2YUJFbjR1TsFVVRxWVUJFbJV0TstmaRxWUUJFbzl3SElTeLJXTwwEd5ITW1NWbi5WNXl1M1kmYr5kMMZ3bENGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
注意,字元串常量(使用雙引号)不能與字元常量(使用單引号)互換。字元常量(如’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)
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;
}