2015-09-23 77 views
-3
#include <stdio.h> 
int main() { 
int c; 
while ((c = getchar()) != EOF) { 
    putchar(c); 
    } 
} 

這工作得很好,當EOF(CTRL + Z)是一個新的生產線,但是當輸入 是:
布拉布拉^ Z
這是行不通的。 當我調試程序時,它告訴我輸入「^ z」(^ z = EOF)被保存爲26,
,但是當輸入^ z在新行中時,它被保存爲-1。 爲什麼?
萬一有任何不明白:
它保存在變量c,並沒有工作意味着它不終止while循環,只有當輸入^ Z被放在一個新行它使用tearminates循環
IM windows的getchar和EOF C語言進行編程

+2

你在代碼中忘了'#include '。你的問題可能是特定於操作系統的。在我的Linux系統上,CtrlZ與EOF無關。 –

+0

嘗試管道文件。由於線路緩衝,終端有時會表現出奇怪的現象。 – Olaf

+0

「不起作用」是沒有**特定的**問題描述。 「輸入^ z保存爲26」也不清楚。它保存在哪裏?哪個輸入? – Olaf

回答

0

也許你錯了,CTRL + z符號不會發送到getchar()函數(這會給EOF),而是運行你的系統(例如它會「停止」該程序)。

嘗試

#include <stdio.h> 

int main() { 
int c; 
while ((c = getchar()) != EOF) { 
// while ((c = getchar()) != '.') { 
    putchar(c); 
    } 
    putchar('W'); 
} 

你看到輸出中的 'W' 在任何情況下? (特別是在使用新行的時候),在我的情況下,我得到了「停止」(在UNIX系統上,CTRL+Z is used to suspend a process)。

On Windows system, the answer has already been given on SO

在一行結束時,擊中^ Z(或^ d Linux上)不會引起 終端驅動程序發送EOF。它只會將緩衝區刷新到您的 進程(沒有\ n)。

在行的開始處敲擊^ z(或^ d)被終端解釋爲 「我想要EOF信號」。

+0

是的,看到輸出W(btw即時通訊使用Windows) – sebastian

+0

好吧,在Windows上嘗試後,我得到了與你一樣的行爲。 – cyrobin

+0

好吧,其實它一直在這裏回答:http://stackoverflow.com/questions/7373386/eof-in-windows-command-prompt-doesnt-terminate-input-stream – cyrobin