簡體   English   中英

為什么此C程序輸出奇怪的字符?

[英]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循環將i98遞增到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM