我目前正在學習 C,我編寫了這個程序來檢查 '\0' 字符是否真的在字符串的末尾,如“K 和 R”中所指出的。
我得到了最奇怪的結果。
如果我評論“int lista[] = {0, 1, 2, 3, 4};” 程序外的語句(這是一個與該程序的其他語句無關的語句,它是我將要進行的另一個測試的一部分)。程序的輸出結果如何,檢測到一個以字符串結尾的 '\0' 字符。但是,如果我不註釋該語句,程序輸出將檢測到字符串末尾的兩個 '\0'字符。為什麼會發生這種情況?
這是語句未註釋的程序:
#include <stdio.h>
int main(void)
{
int lista[] = {0, 1, 2, 3, 4};
char string[] = "linhas";
for (int i = 0; i <= sizeof(string); i++)
{
if (string[i] != '\0')
{
printf("%c\n", string[i]);
}
else
{
printf("this dawmn null char\n");
}
}
}
這輸出:
l
i
n
h
a
s
this dawmn null char
this dawmn null char
這是該行註釋掉的程序:
#include <stdio.h>
int main(void)
{
/*int lista[] = {0, 1, 2, 3, 4};*/
char string[] = "linhas";
for (int i = 0; i <= sizeof(string); i++)
{
if (string[i] != '\0')
{
printf("%c\n", string[i]);
}
else
{
printf("this dawmn null char\n");
}
}
}
它輸出:
l
i
n
h
a
s
this dawmn null char
你的循環
for (int i = 0; i <= sizeof(string); i++)
總是有點錯誤。它應該是
for (int i = 0; i < sizeof(string); i++)
通過使用<=
,您在循環中進行了過多的旅行,並且您訪問了string
數組之外的內存。看起來,lista
數組就位後,您錯誤訪問的額外字節(string
數組外)恰好是 0,因此您會得到“this dawmn null char”消息的額外第二次打印輸出。
但是,當您註釋掉lista
數組時,一定是您錯誤訪問的額外字節不是 0,因此它會被打印為本身。它可能是一個不可見的控製字符,這就是為什麼你什麼都看不到的原因。我建議將您的代碼更改為
if (string[i] != '\0')
printf("string contains %d\n", string[i]);
else printf("this damn null char\n");
更清楚地看到這一點。
這裡的重要教訓是,如果你有一個應該運行 N 次的循環,有兩種編寫它的方法。在 C 中,絕大多數時候,你想把它寫成
for(i = 0; i < N; i++)
這是一個“基於 0”的循環,從 0 到 N-1 運行,總共 N 次。偶爾,您需要一個基於 1 的循環:
for(i = 1; i <= N; i++)
這從 1 到 N 運行,同樣總共 N 趟。但是如果你寫
for(i = 0; i <= N; i++) /* usually WRONG */
您的循環從 0 運行到 N,總共 N+1 趟。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句