2016-07-30 59 views
2
#include <stdio.h> 
int main(){ 
    char ch; 
    while((ch=getchar())!=EOF){ 
     putchar(ch); 
    } 
    char ch2 = 'A'; 
    printf("ch2=======>%c\n",ch2); 
    ch2 = getchar(); 
    printf("ch2=======>%d\n",ch2); 
    return 0; 
} 

我不明白爲什麼它會跳過ch2=getchar()輸入,並且我得到CH2 == -1這是EOF的值。我試圖通過在ch2=getchar()之前添加另一個getchar()來解決此問題,但我仍然得到ch2 == -1。爲什麼以及如何解決它?感謝您的幫助。CH2 =的getchar()最後輸入迴路後不工作,而((CH =的getchar())!= EOF)

我正在使用MacOS。

+0

爲什麼在此示例中甚至使用EOF?據我所見,這段代碼與File無關。 –

+0

最後輸入是'EOF',所以它不會進入循環內部; –

+3

一旦你達到了輸入結束,任何進一步的嘗試讀取仍然會結束輸入。 – melpomene

回答

0

毫無意外。您的迴路

while((ch=getchar())!=EOF){ 
     putchar(ch); 
} 

完全排出stdin。然後printf()增加了一些數據到stdout,但stdin仍然是空的,所以後面的getchar()返回EOF

+1

是的,但是,如果從鍵盤輸入標準輸入(像往常一樣),即使在輸入Ctrl-Z之後,通常也可以繼續輸入,並且標準輸入不會真的耗盡。 –

+0

@RudyVelthuis最後一次循環迭代和'ch2 = getchar();之間的時間片非常小,用戶肯定無法提供新的鍵盤輸入,STDIN仍然可能被視爲空。 – Sergio

+0

getchar()是,AFAIK,緩衝,所以程序將等待輸入,直到有人按下回車鍵(或任何被調用的鍵)。時間片應該是無關緊要的。 –

1

編譯時,總是使所有的警告,然後修復這些警告

我用這個版本的代碼,它完全編譯的:

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

隨後進入:

ddd<ctrl-d>ccc<cr> 

這是預期的(和實際)結果:

ddd 
ddd 
ch2=======>A 
ccc 
ch2=======>99 

注:

1)getchar()不會返回,直到一個或<cr><ctrl-d>輸入

2)所有輸入的字符是由終端驅動器(未程序)

3)回顯在輸入緩衝區中仍有2 c s和<cr>尚未消耗

+0

您是否使用Linux或MacOS,因爲我注意到您鍵入了「Ctrl + D」。我在Mac上覆制了你的代碼並運行它。它不起作用。但是我的代碼和你的代碼在Windows上都很好。 – Tianqing

+0

我敢打賭,他正在使用Linux。 –