二空字符字符串
忽略不,它不會被忽略。如果你運行這個程序示範
#include <stdio.h>
int main(void)
{
char word[]= {'H','e','l','l','o','\0','\0'};
char word2[]= "Hello\0\0";
printf("sizeof(word) = %zu\n", sizeof(word));
printf("sizeof(word2) = %zu\n", sizeof(word2));
}
您將得到以下結果
sizeof(word) = 7
sizeof(word2) = 8
這是所有零字符被列入字符數組。
考慮到字符串文字也包含不可見的空終止字符。那就是這個字符串文字"Hello\0\0"
(類型爲char[8]
)被存儲在內存中,如{ 'H', 'e', 'l', 'l', 'o', '\0', '\0', '\0' }
。
冗餘零字符由一些功能,如例如忽略功能strlen
或功能printf
在格式說明%s
被使用,因爲這些功能考慮字符數組爲包含字符串是由零字符分隔的字符序列。
此外,您可以使用零初始化字符數組的所有元素。例如
char s[5] = { '\0' };
此聲明等效於
char s[5] = { '\0', '\0', '\0', '\0', '\0' };
或者你甚至可以寫
char s[] = "\0\0\0\0";
其實這個聲明等效於數組s
以前的聲明是數組將包含5
零個字符。
如果執行該語句
printf("%zu\n", sizeof(s));
你會得到預期5
。但是,如果你執行該語句
printf("%zu\n", strlen(s));
或本聲明
printf("%s\n", s);
你會得到0或(在第二種情況下)不會顯示任何內容,除了光標將在下一行移動..
第二種情況'word2 []'實際上有*三個* nul字符:你放在那裏的兩個,編譯器放在那裏的那個。 –
倒票的原因是什麼? – Dchris
可能是因爲你沒有顯示任何研究工作?在提問之前閱讀C書,這是基本的東西。 – Olaf