簡體   English   中英

為什么這個getchar()循環在輸入一個字符后停止?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM