久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

3.2 字符序列 (Character Sequences)

 奮進(jìn)一生 2015-09-26

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");

例如:

// setting value to string
#include <iostream.h>
#include <string.h>

int main () {
char szMyName [20];
strcpy (szMyName,"J. Soulie");
cout << szMyName;
return 0;
}
J. Soulie

注意:我們需要包括頭文件才能夠使用函數(shù)strcpy

雖然我們通??梢詫?xiě)一個(gè)像下面setstring一樣的簡(jiǎn)單程序來(lái)完成與cstringstrcpy同樣的操作:

// setting value to string
#include <iostream.h>

void setstring (char szOut [ ], char szIn [ ]) {
int n=0;
do {
szOut[n] = szIn[n];
} while (szIn[n++] != '\0');
}

int main () {
char szMyName [20];
setstring (szMyName,"J. Soulie");
cout << szMyName;
return 0;
}
J. Soulie

另一個(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)輸入字符串:

// cin with strings
#include <iostream.h>

int main () {
char mybuffer [100];
cout << "What's your name? ";
cin.getline (mybuffer,100);
cout << "Hello " << mybuffer << ".\n";
cout << "Which is your favourite team? ";
cin.getline (mybuffer,100);
cout << "I like " << mybuffer << " too.\n";
return 0;
}
What's your name? Juan
Hello Juan.
Which is your favourite team? Inter Milan
I like Inter Milan too.

注意上面例子中兩次調(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)有的:

  • 它只能接收單獨(dú)的詞(而不能是完整的句子),,因?yàn)檫@種方法以任何空白符為分隔符,,包括空格spaces,跳躍符tabulators,,換行符newlines和回車符arriage returns,。
  • 它不能給buffer指定容量,這使得程序不穩(wěn)定,,如果用戶輸入超出數(shù)組長(zhǎng)度,,輸入信息會(huì)被丟失。

因此,,建議在需要用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ù):

  • atoi: 將字符串string 轉(zhuǎn)換為整型int
  • atol: 將字符串string 轉(zhuǎn)換為長(zhǎng)整型long
  • atof: 將字符串string 轉(zhuǎn)換為浮點(diǎn)型float

所有這些函數(shù)接受一個(gè)參數(shù),,返回一個(gè)指定類型的數(shù)據(jù)(int, long 或 float)。這三個(gè)函數(shù)與cin.getline 一起使用來(lái)獲得用戶輸入的數(shù)值,,比傳統(tǒng)的cin>> 方法更可靠:

// cin and ato* functions
#include <iostream.h>
#include <stdlib.h>

int main () {
char mybuffer [100];
float price;
int quantity;
cout << "Enter price: ";
cin.getline (mybuffer,100);
price = atof (mybuffer);
cout << "Enter quantity: ";
cin.getline (mybuffer,100);
quantity = atoi (mybuffer);
cout << "Total price: " << price*quantity;
return 0;
}
Enter price: 2.75
Enter quantity: 21
Total price: 57.75

字符串操作函數(shù)(Functions to manipulate strings)

函數(shù)庫(kù)cstring (string.h) 定義了許多可以像C語(yǔ)言類似的處理字符串的函數(shù) (如前面已經(jīng)解釋過(guò)的函數(shù)strcpy),。這里再簡(jiǎn)單列舉一些最常用的:

  • strcat: char* strcat (char* dest, const char* src); //將字符串src 附加到字符串dest 的末尾,返回dest,。
  • strcmp: int strcmp (const char* string1, const char* string2); //比較兩個(gè)字符串string1 和string2,。如果兩個(gè)字符串相等,,返回0,。
  • strcpy: char* strcpy (char* dest, const char* src); //將字符串src 的內(nèi)容拷貝給dest,返回dest ,。
  • strlen: size_t strlen (const char* string); //返回字符串的長(zhǎng)度,。

注意:char* 與char[] 相同。

關(guān)于這個(gè)函數(shù)庫(kù)的更多信息,,參閱 C++ Reference ,。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多