2016-12-14 211 views
2

考慮下面的代碼:輸入緩衝器沖洗

#include<stdio.h> 
int main(){ 
char c; 
while((c=getchar()) != EOF) 
     printf("%c\n",c); 
return 0; 
} 

我給輸入爲:喜^ Z

輸出爲:

h 
i 
(an arrow pointing towards left) 

[對不起,我無法找到上述箭頭的字符。 ]

有人可以解釋輸出嗎?由於^ Z是字符串的一部分,並有字符以紅暈,我覺得^ Z不應該都已經過去了,因此輸出應該是,

h 
i 
(new line) 

PS - 我在Windows並且^ Z因此是EOF。

+0

當我把'^ Z'放在一個單獨的行上時,它對我很好。 – Quirk

回答

4

這裏的問題是,char不足以保存值EOF。您需要使用int類型。

char c;更改爲int c;

也就是說,getchar()將返回任何標準輸入中的未決項目。如果您在輸入一些內容後使用了組合鍵,則該操作與沖洗流類似。要從getchar()返回EOF,您需要再次按下組合鍵。

總之,如果你希望getchar()CTRL +ž返回EOF確保沒有什麼是在stdin

也就是說,對於託管環境,main()的正確簽名至少爲int main(void)

+0

你能解釋一下那個角色出​​現在哪裏嗎?我的意思是說,輸出中的h和i的存在沒有問題,但箭頭事情正在困擾着我。我想,^ Z不應該被傳遞給程序,儘管它在給定的輸入中存在?爲什麼它會通過? – Wayne

1

參照http://www.cplusplus.com/reference/cstdio/getchar/ 它說getchar返回類型是int。編譯器應該給出警告。請不要忽略這些警告。

您正在分配intchar這將導致損失。嘗試將其放入int並打印出來。

您也可以使用%cprintf中打印int,並將類型轉換爲char