簡體   English   中英

C:簡單的復制輸入(getchar)到輸出(printf)返回多余的行

[英]C: Simple copy input (getchar) to output (printf) return extra lines

我正在用C測試一個簡單的程序:

int main() {
    int c;

    c  = getchar();

    while ( c != EOF ) {
        printf("%c\n", c);
        c = getchar();
    }
}

但是,當我輸入“ a”,“ b”之類的簡單輸入時,它會打印出“ a \\ n \\ n,b \\ n \\ n” ...有人可以解釋一下嗎? 謝謝!

☛  gcc hello.c; ./a.out
a
a


b
b


c
c

因為它既得到EOL字符,又得到您鍵入的字符。

您輸入的不是“ a”,“ b”,而是“ a \\ nb \\ nc \\ n”,並且您的腳本配置為(基本上)在每個字符之后輸出新行。

因此,在循環中,它第一次獲得“ a”並輸出“ a \\ n”,然后就獲得“ \\ n”並輸出“ \\ n \\ n”。 然后是“ b”和“ b \\ n”,依此類推。

嘗試以下尺寸:

int main() {
    int size = 500;
    char buff[size];
    char* check;
    int read;


    check = fgets(buff, sizeof(buff), stdin);

    while ( check != NULL ) {
        printf("%s", buff);
        check = fgets(buff, sizeof(buff), stdin);
    }
}

看代碼

 printf("%c\n", c);

也就是說先打印字符,然后換行。 除了回顯具有字符和換行符的輸入之外。

您可能需要關閉字符回顯以進行交互使用。 或者只是從文件中讀取輸入。

輸入字符並按Enter后,'\\ n'換行符仍保留在輸入流中,並使用第二個getchar()進行拾取。

因此,您的printf會打印出一個換行符,然后再打印另一個,因為它拾取了換行符。

getchar()從輸入緩沖區獲取一個字符。 默認情況下,輸入模式是行緩沖的(“規范”模式),這意味着您輸入“ a”,然后按Enter / Return鍵,並且只有在將該數據放入輸入緩沖區之后,這會導致兩個字符添加到輸入緩沖區:“ a”字符本身和“ \\ n”字符對應於Enter / Return鍵。

如果需要,不同的操作系統會有不同的切換到非緩沖(“非規范”)模式的方法。 這是UNIX / Linux系統上的ioctl()tcsetattr()魔術,而在Windows上是SetConsoleMode()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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