2011-09-20 47 views
1

我有以下程序爲什麼這個奇怪的輸出在c?

#include <stdio.h> 

main() 
{ 

    char ch[10]; 

    gets(ch); 

    printf("\nTyped: %s\n\n", ch); 

    int i = 0; 
    while (ch[i] != '\0') 
    { 
     printf("Letter: %c\n", ch[i]); 
     i++; 
    } 

    printf("\nTyped: %s\n\n", ch); 


} 

,這裏是輸出的時候我輸入的「Hello world好」

hello world is good 

Typed: hello world is good 

Letter: h 
Letter: e 
Letter: l 
Letter: l 
Letter: o 
Letter: 
Letter: w 
Letter: o 
Letter: r 
Letter: l 
Letter: 


Typed: hello worl♂ 

爲什麼我while循環之後得到了相同的命令兩個不同的輸出?不while循環有什麼關係呢..請幫助..

+0

好吧,你有一方面的大教堂,另一方面是奇怪的:^) –

+1

不要使用'gets'! **從來沒有!** –

回答

5

你的字符數組ch只有10個字符的空間。你輸入了超過10個字符的東西,並試圖將其存儲在該數組中,有效地將超出數組末尾的空間寫入沒有預留給任何東西(或者至少不會保留給你的字符)的空間中。你有在這種情況下,幸運地在任何重要的東西沒有寫(您的程序沒有崩潰),但隨後的代碼來走過(printf(),你int i等)和變化內存(它的堆棧,畢竟,所以它以FIFO順序使用)。

更改char ch[10]char ch[2048]給自己一個更大的緩衝區來鍵入。您也可以使用fgets()而不是gets(),這樣您可以將輸入大小限制爲緩衝區大小。如果你使用gets(),聽取手冊頁上的警告:

這是調用者的責任,以確保輸入線,如果 任何,足夠短,以適應的字符串中。

+0

謝謝,這是非常有益的感謝大家.... – srisar

8

你知道的「Hello world好」超過10個字節?在這種情況下的行爲是undefined。任何事情都可能發生,無論如何,從你的工作想要到您的系統的總崩潰與重新格式化硬盤驅動器和燃燒的垃圾通過您的ROM。

必須爲gets分配足夠的空間放於字符串,在這種情況下你不知道。這是爲什麼gets應該避免的主要原因,請使用fgets來代替。

+1

我很感激downvoter的評論,謝謝 – littleadv

2

好了,你只分配10個字符(char ch[10]),這符合 「你好WORL」。之後,你只是在嘗試打印內存中的垃圾。

+1

這是爲什麼downvoted? – Blender

+0

但是爲什麼當它立即被調用時打印出來,而不是在while循環之後?這是我的問題... 10個字節是有目的地做了測試這..可以幫助你現在 – srisar

+0

@srisar - 行爲是** undefined **。爲什麼?因爲。任何答案都是錯誤的。你不應該那樣做。 – littleadv

相關問題