2011-07-15 92 views
3
#include <stdio.h> 

// copy input to output 
// my version 

int main() 
{ 
    int c; 

    printf("\n\nUse CONTROL + D to terminate this program\n\n"); 

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

    if ((c = getchar()) == EOF) { 
     printf("\n\nProgram TERMINATED\n\n"); 
    } 

    return 0; 
} 

獲取輸入當我進入控制 + d,該if語句運行的機構。這就是我想要的,但是當我更徹底地分析代碼時,不應該再次詢問我的輸入,因爲if的條件是(c = getchar()) == EOF在if條件

+0

爲什麼'int'而不是'char'? – alex

+0

@alex:因爲'getchar'返回一個'int'(實際上是一個'unsigned char'轉換爲'int'或者'EOF' - 根據定義它是一個負數)。 – jweyrich

回答

2

當您點擊^D時,程序輸入被關閉,因此getchar()隨後將始終返回EOF

+0

那麼如果每次調用'getchar()'在'^ D'之後都不起作用,我該如何再次輸入? – Espresso

+0

使用除'^ D'(和隨後的文件結尾)以外的內容來終止您的輸入。 – duskwuff

0

^D立即終止程序。因此,當^ D被擊中時,你是getchar永遠不會返回的。

這就是爲什麼REPL像python退出使用'exit()'。

如果你想,嘗試使用 'Q' 爲在quiting:

+4

這可能表達得更好 - '^ D'通常不會終止程序,只是它們的輸入。該計劃可以隨意忽略缺乏投入並繼續其快樂的方式。 – Cascabel

1

控制-d是規範模式結束文件字符。當在一行的開頭處輸入時,它會導致進程看到EOF條件,即讀取返回0.但是,如果如果Control-D進入除行開頭之外的某處,它只會導致讀取立即返回迄今已輸入的內容。

如果你連續兩次擊中Control-D,你應該看到我想問你的問題。

編輯

Here是一個相當不錯的解釋。