2014-01-09 21 views
0
main() 
{ 
    int c; 
    while ((c = getchar()) != EOF) 
    { 
     putchar(c); 
    } 
} 

我知道getchar()緩衝了字符。如果我執行這個程序並輸入一些字符如Hello而沒有按回車我按EOF字符爲什麼它再次打印Hello並要求新角色?c中的getchar()在使用它時

+0

_I按EOF character_意味着你做了什麼? –

+1

'EOF',在窗口中它是'CTRL + Z'。而在Linux中,它將會是'CTRL + D' – Rugal

+0

我按下ctrl + D – Rohit

回答

4

當您鍵入'EOF'字符時,終端驅動程序會使輸入緩衝區中的所有字符都可用於程序,即使您沒有鍵入換行符。由於getchar()下面的代碼得到了一些字符,它不在EOF中。當你鍵入第二個'EOF'時,沒有剩餘字符需要發送(但終端驅動程序讓read()函數知道有0個字節可用),所以read得到0字節返回,這表明EOF。

2

這是因爲在輸入完整行之前,程序沒有收到shell的輸入。直到它被存儲在終端程序的緩衝區中。默認情況下,終端將緩存所有信息,直到按下ENTER鍵,然後纔將其發送到C程序。

+1

但是當我按下第一個EOF時,爲什麼它像我按Enter鍵一樣。 – Rohit

0

如果您使用的是Linux,可能是gcc,那麼您必須按ctrl + D進行EOF。如果在輸入少量字符後沒有按下回車鍵,當然可以按兩次。

+1

學習:我有同樣的問題 - 爲什麼我需要按兩次? – Karan

+0

按回車鍵或第一個EOF用於向C提供緩衝區。可以想象,如果緩衝區不爲空,那麼EOF只是充當完成信號並且在緩衝區中輸入完成(它不作爲緩衝區中的字符插入)。如果緩衝區是空的而不是它的一個字符。所以只有當你輸入EOF而沒有其他字符時,程序纔會退出。 – learning

1

就像getchar填充一個緩衝區,然後「讀取」一個字符,putchar打印字符時也會做同樣的事情。要在一次I/O中執行字符,您需要以非緩衝模式打開輸入和輸出流。但是,這可能非常低效,特別是如果程序輸入和輸出直接從文件或管道讀取和寫入。相反,在可能的情況下使用緩衝輸入和輸出,或者每當確實需要寫入輸出時(無論I/O緩衝區是否已滿),都要對flush任何輸出流進行明確調用。