用一個字符數組可以存放一個字符串中的字符。如:
char str[12]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};
用一維字符數組str來存放一個字符串″I am happy″中的字符。字符串的實際長度(10)與數組長度(12)不相等,在存放上面10個字符之外,系統對字符數組最后兩元素自動填補空字符′\0′。為了測定字符串的實際長度,C++規定了一個“字符串結束標志”,以字符′\0′代表。在上面的數組中,第11個字符為′\0′,就表明字符串的有效字符為其前面的10個字符。也就是說,遇到字符′\0′就表示字符串到此結束,由它前面的字符組成字符串。
對一個字符串常量,系統會自動在所有字符的后面加一個′\0′作為結束符。例如字符串″I am happy″共有10個字符,但在內存中它共占11個字節,最后一個字節′\0′是由系統自動加上的。
在程序中往往依靠檢測′\0′的位置來判定字符串是否結束,而不是根據數組的長度來決定字符串長度。當然,在定義字符數組時應估計實際字符串長度,保證數組長度始終大於字符串實際長度。如果在一個字符數組中先后存放多個不同長度的字符串,則應使數組長度大於最長的字符串的長度。
說明:′\0′只是一個供辨別的標志。
如果用以下語句輸出一個字符串:
cout<<″
How do you do?″;
系統在執行此語句時逐個地輸出字符,那么它怎么判斷應該輸出到哪個字符就停止了呢?
在C語言中,把一個字符串存入一個數組時,也把結束符 '\0'存入數組,並以此作為該字符串是否結束的標志。有了'\0'標志后,就不必再用字符數組的長度來判斷字符串的長度了。 '\0'就是字符串結束標志,在C++中,則會把字符長度存在對象的.size()中,前提是使用string類,不是字符數組,string類用字符長度判斷是否結束,就不會在最后插入一個'\0'來判斷是否結束。##
下面再對字符數組初始化補充一種方法:用字符串常量來初始化字符數組。例如:
char str[]={″I am happy″};
也可以省略花括號,直接寫成
char str[]=″I am happy″;
不是用單個字符作為初值,而是用一個字符串(注意字符串的兩端是用雙撇號而不是單撇號括起來的)作為初值。顯然,這種方法直觀,方便,符合人們的習慣。注意:數組str的長度不是10,而是11(因為字符串常量的最后由系統加上一個′\0′)。因此,上面的初始化與下面的初始化等價:
char str[]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’\0′};
而不與下面的等價:
char str[]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};
前者的長度為11,后者的長度為10。如果有
char str[10]=″China″;
數組str的前5個元素為′C′,′h′,′i′,′n′,′a′,第6個元素為′\0′,后4個元素為空字符。
int _tmain(int argc, _TCHAR* argv[])
{
char buf[6] = "apple"; //buf[5]直接在編譯階段就報錯,尾端必須留出一個位置給'\0'
int i = -1, j = 1;
while (j)
if (buf[++i] != '\0')
{
j = 1;
printf("%c\n", buf[i]);
}
else
{
j = 0;
printf("%s\n", "end of cin");
}
return 0;
}