3.2 字符序列 (Character Sequences)前面基礎(chǔ)知識(shí)部分講C++變量類型的時(shí)候,,我們已經(jīng)提到過(guò)C++的標(biāo)準(zhǔn)函數(shù)庫(kù)提供了一個(gè)string類來(lái)支持對(duì)字符串的操作,。然而,,字符串實(shí)際就是一串連續(xù)的字符序列,所以我們也可以用簡(jiǎn)單的字符數(shù)組來(lái)表示它,。 例如,,下面這個(gè)數(shù)組: char jenny [20];
是一個(gè)可以存儲(chǔ)最多20個(gè)字符類型數(shù)據(jù)的數(shù)組。你可以把它想象成: 理論上這數(shù)組可以存儲(chǔ)長(zhǎng)度為20的字符序列,,但是它也可以存儲(chǔ)比這短的字符序列,,而且實(shí)際中常常如此。例如,,jenny 在程序的某一點(diǎn)可以只存儲(chǔ)字符串"Hello" 或者"Merry christmas",。因此,既然字符數(shù)組經(jīng)常被用于存儲(chǔ)短于其總長(zhǎng)的字符串,,就形成了一種習(xí)慣在字符串的有效內(nèi)容的結(jié)尾處加一個(gè)空字符(null character)來(lái)表示字符結(jié)束,,它的常量表示可寫(xiě)為0 或'\0'。 我們可以用下圖表示jenny (一個(gè)長(zhǎng)度為20的字符數(shù)組) 存儲(chǔ)字符串"Hello" 和"Merry Christmas" : 注意在有效內(nèi)容結(jié)尾是如何用空字符null character ('\0')來(lái)表示字符串結(jié)束的,。 后面灰色的空格表示不確定數(shù)值,。 初始化以空字符結(jié)束的字符序列(Initialization of null-terminated character sequences)因?yàn)樽址麛?shù)組其實(shí)就是普通數(shù)組,它與數(shù)組遵守同樣的規(guī)則,。例如,,如果我們想將數(shù)組初始化為指定數(shù)值,我們可以像初始化其它數(shù)組一樣用: char
mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
在這里我們定義了一個(gè)有6個(gè)元素的字符數(shù)組,,并將它初始化為字符串Hello 加一個(gè)空字符(null character '\0'),。 除此之外,字符串還有另一個(gè)方法來(lái)進(jìn)行初始化:用字符串常量,。 在前幾章的例子中,,字符串常量已經(jīng)出現(xiàn)過(guò)多次,,它們是由雙引號(hào)引起來(lái)的一組字符來(lái)表示的,,例如: "the result is:
"
是一個(gè)字符串常量,我們?cè)谇懊娴睦又幸呀?jīng)使用過(guò),。 與表示單個(gè)字符常量的單引號(hào)(')不同,,雙引號(hào) (")是表示一串連續(xù)字符的常量。由雙引號(hào)引起來(lái)的字符串末尾總是會(huì)被自動(dòng)加上一個(gè)空字符 ('\0') ,。 因此,,我們可以用下面兩種方法的任何一種來(lái)初始化字符串mystring: char mystring [ ] = { 'H', 'e', 'l', 'l', 'o', '\0'
};
char mystring [ ] = "Hello"; 在兩種情況下字符串或數(shù)組mystring都被定義為6個(gè)字符長(zhǎng)(元素類型為字符char):組成Hello的5個(gè)字符加上最后的空字符('\0')。在第二種用雙引號(hào)的情況下,,空字符('\0')是被自動(dòng)加上的,。 注意:同時(shí)給數(shù)組賦多個(gè)值只有在數(shù)組初始化時(shí),也就是在聲明數(shù)組時(shí),,才是合法的,。象下面代碼現(xiàn)實(shí)的表達(dá)式都是錯(cuò)誤的: mystring = "Hello";
mystring[ ] = "Hello"; mystring = { 'H', 'e', 'l', 'l', 'o', '\0' }; 因此記?。何覀冎挥性跀?shù)組初始化時(shí)才能夠同時(shí)賦多個(gè)值給它。其原因在學(xué)習(xí)了指針(pointer)之后會(huì)比較容易理解,,因?yàn)槟菚r(shí)你會(huì)看到一個(gè)數(shù)組其實(shí)只是一個(gè)指向被分配的內(nèi)存塊的常量指針(constant pointer),,數(shù)組自己不能夠被賦予任何數(shù)值,但我們可以給數(shù)組中的每一個(gè)元素賦值,。 在數(shù)組初始化的時(shí)候是特殊情況,,因?yàn)樗皇且粋€(gè)賦值,雖然同樣使用了等號(hào)(=) ,。不管怎樣,,牢記前面標(biāo)下畫(huà)線的規(guī)則。 給字符序列的賦值因?yàn)橘x值運(yùn)算的lvalue 只能是數(shù)組的一個(gè)元素,,而不能使整個(gè)數(shù)組,,所以,用以下方式將一個(gè)字符串賦給一個(gè)字符數(shù)組是合法的: mystring[0] = 'H';
mystring[1] = 'e'; mystring[2] = 'l'; mystring[3] = 'l'; mystring[4] = 'o'; mystring[5] = '\0'; 但正如你可能想到的,,這并不是一個(gè)實(shí)用的方法,。通常給數(shù)組賦值,或更具體些,,給字符序列賦值的方法是使用一些函數(shù),,例如strcpy。strcpy (string copy) 在函數(shù)庫(kù)cstring (string.h) 中被定義,,可以用以下方式被調(diào)用: strcpy (string1,
string2);
這個(gè)函數(shù)將string2 中的內(nèi)容拷貝給string1,。string2 可以是一個(gè)數(shù)組,一個(gè)指針,,或一個(gè)字符串常量constant string,。因此用下面的代碼可以將字符串常量"Hello"賦給mystring: strcpy (mystring,
"Hello");
例如:
注意:我們需要包括頭文件 雖然我們通??梢詫?xiě)一個(gè)像下面setstring一樣的簡(jiǎn)單程序來(lái)完成與cstring 中strcpy同樣的操作:
另一個(gè)給數(shù)組賦值的常用方法是直接使用輸入流(cin),。在這種情況下,字符序列的值是在程序運(yùn)行時(shí)由用戶輸入的,。 當(dāng)cin 被用來(lái)輸入字符序列值時(shí),,它通常與函數(shù)getline 一起使用,方法如下: cin.getline ( char
buffer[], int length, char delimiter = ' \n');
這里buffer 是用來(lái)存儲(chǔ)輸入的地址(例如一個(gè)數(shù)組名),,length 是一個(gè)緩存buffer 的最大容量,,而delimiter 是用來(lái)判斷用戶輸入結(jié)束的字符,它的默認(rèn)值(如果我們不寫(xiě)這個(gè)參數(shù)時(shí))是換行符newline character ('\n'),。 下面的例子重復(fù)輸出用戶在鍵盤(pán)上的任何輸入,。這個(gè)例子簡(jiǎn)單的顯示了如何使用cin.getline來(lái)輸入字符串:
注意上面例子中兩次調(diào)用cin.getline 時(shí)我們都使用了同一個(gè)字符串標(biāo)識(shí) (mybuffer)。程序在第二次調(diào)用時(shí)將新輸入的內(nèi)容直接覆蓋到第一次輸入到buffer 中的內(nèi)容,。 你可能還記得,,在以前與控制臺(tái)(console)交互的程序中,,我們使用extraction operator (>>) 來(lái)直接從標(biāo)準(zhǔn)輸入設(shè)備接收數(shù)據(jù)。這個(gè)方法也同樣可以被用來(lái)輸入字符串,,例如,,在上面的例子中我們也可以用以下代碼來(lái)讀取用戶輸入: cin
>> mybuffer;
這種方法也可以工作,但它有以下局限性是cin.getline所沒(méi)有的:
因此,,建議在需要用cin來(lái)輸入字符串時(shí),,使用cin.getline來(lái)代替cin >>。 字符串和其它數(shù)據(jù)類型的轉(zhuǎn)換(Converting strings to other types)鑒于字符串可能包含其他數(shù)據(jù)類型的內(nèi)容,,例如數(shù)字,,將字符串內(nèi)容轉(zhuǎn)換成數(shù)字型變量的功能會(huì)有用處。例如一個(gè)字符串的內(nèi)容可能是"1977",,但這一個(gè)5個(gè)字符組成序列,,并不容易轉(zhuǎn)換為一個(gè)單獨(dú)的整數(shù)。因此,,函數(shù)庫(kù)cstdlib (stdlib.h) 提供了3個(gè)有用的函數(shù):
所有這些函數(shù)接受一個(gè)參數(shù),,返回一個(gè)指定類型的數(shù)據(jù)(int, long 或 float)。這三個(gè)函數(shù)與cin.getline 一起使用來(lái)獲得用戶輸入的數(shù)值,,比傳統(tǒng)的cin>> 方法更可靠:
字符串操作函數(shù)(Functions to manipulate strings)函數(shù)庫(kù)cstring (string.h) 定義了許多可以像C語(yǔ)言類似的處理字符串的函數(shù) (如前面已經(jīng)解釋過(guò)的函數(shù)strcpy),。這里再簡(jiǎn)單列舉一些最常用的:
注意:char* 與char[] 相同。 關(guān)于這個(gè)函數(shù)庫(kù)的更多信息,,參閱 C++ Reference ,。 |
|