[英]Why does this getchar() loop stop after one character has been entered?
#include <stdio.h>
int main() {
char read = ' ';
while ((read = getchar()) != '\n') {
putchar(read);
}
return 0;
}
我的輸入是f
(當然是輸入)。 我希望getchar()
再次請求輸入,但程序終止。 怎么會? 我怎樣才能解決這個問題?
終端有時會有點混亂。 您應該將程序更改為:
#include <stdio.h>
int main() {
int read;
while ((read = getchar()) != EOF) {
putchar(read);
}
return 0;
}
這將讀取直到getchar從終端讀取EOF(大多數時候此宏擴展為-1)。 getchar返回一個int,因此你應該將變量'read'變成一個整數,這樣你就可以檢查EOF。 您可以使用^ D從Linux上的終端發送EOF,我想在帶有^ Z(?)的Windows上。
稍微解釋會發生什么。 在你的程序中表達
(read = getchar()) !='\n'
只要沒有從緩沖區中讀取'\\ n',它就是真的。 問題是,要將緩沖區添加到程序中,必須按Enter鍵對應'\\ n'。 在終端中調用程序時,會發生以下步驟:
~$\a.out
這開始你的程序
(empty line)
getchar()進行系統調用以從終端獲取輸入並且終端接管
f
你在終端做了一個輸入。 'f'被寫入緩沖區並在終端上回顯,你的程序還不知道該字符。
f
f~$
你點擊進入。 你的緩沖區現在包含'f \\ n'。 'enter'也向終端發出信號,它應該返回你的程序。 你的程序讀取緩沖區並找到f並將其放到屏幕上,然后找到一個'\\ n'和immediatley停止循環並結束你的程序。
這將是大多數終端的標准行為。 您可以更改此行為,但這取決於您的操作系統。
getchar()返回輸入流中的下一個字符。 這當然也包括換行等。除非你按'Enter',否則你的循環中看不到進展的事實是由於你的文件I / O(在stdin上工作)沒有移交輸入緩沖區這一事實到getchar(),除非它在緩沖區的末尾檢測到'\\ n'。 您的例程第一個塊然后在一個沖突中處理兩個擊鍵,像您指定的那樣終止,輸入流中出現'\\ n'。 Facit:getchar()不會從輸入流中刪除'\\ n'(為什么要這樣?)。
在f之后你輸入'/'來表示'/ n'。 所以循環結束了。 如果你想要接受另一個角色,只要按下回車鍵就會一個接一個地將它們一個接一個地放出。
你編程了它,所以當你讀到\\ n(輸入)時循環結束,然后你返回0; 從main退出程序。
也許你想要的東西
while ((read = getchar()) != EOF) {
putchar(read);
}
在n x終端上,您可以按Control-D,它將告訴tty驅動程序將輸入緩沖區返回到讀取它的應用程序。 這就是為什么新行上的^ D結束輸入 - 它導致tty返回零字節,應用程序將其解釋為文件結尾。 但它也適用於任何地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.