[英]Why does this c program output strange characters?
在Windows下的MinGW中編譯后,以下C代碼給出了我無法理解的輸出。
#include <stdio.h>
main()
{
char s[100];
int i,c;
for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i)
s[i]=c;
if(c=='\n'){
s[i]=c;
++i;
}
s[i]='p';
printf("%s",s);
}
輸出是
為什么在“ p”之后有奇怪的字符? 他們的意思是什么?
c中的字符串需要以空值結尾。 這意味着字符串的最后一個字符必須始終為\\0
。
這是您的程序知道從哪里停止讀取字符串的方式,因為它是一個簡單的char
數組,不包含長度信息,就像您在c ++等高級語言中所習慣的那樣。
編輯 :奇怪的字符是讀取有效字符后內存的結果。 由於該內存不包含有效字符,因此可以用各種無法預測的方式對其進行解釋。
您還可能嘗試分配超出s
聲明范圍的值。 您定義了s[100]
,它在s[0]
到s[99]
處給您100個字符。 您的代碼可以嘗試分配未定義的s[100]
。特別是:
for(i=0;i<100-1&&(c=getchar())!=EOF&&c!='\n';++i)
s[i]=c;
for循環將i
從98
遞增到99
並以i=99
終止。 (即, i
不再小於100-1
因此循環在該子句處終止。)看看接下來會發生什么。 如果c
是換行符,則分配s[99]='\\n'
並將i
(++ i)遞增至100
:
if(c=='\n'){
s[i]=c;
++i;
}
仍然可以,但是您無法再次分配s[i]
。 然后,您分配s[100]='p';
。 KABOOM!
s[i]='p';
(現在它並不會每次都用kaboom失敗-將其視為隨時可能掉下來的定時炸彈-隨機發生)。 結合其他答案,您應該可以。
在開始使用數組之前,最好在程序中初始化數組。 這樣可以避免在這種情況下打印垃圾字符。
bzero(s,sizeof(char)* 100);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.