【问题标题】:Why is the input displayed after the enter key has been pressed?为什么按下回车键后显示输入?
【发布时间】:2017-11-16 06:18:50
【问题描述】:
#include <stdio.h>

/* copy input to output */

main()
{
    int c;

    c = getchar();

    while(c != EOF)
        {
        putchar(c);
        c = getchar();
        }

    return 0;
}

在给定的代码中,程序显示输入字符。 它一个一个地读取每个字符(到变量'c'中)并同时输出相同的读取字符。当输入 EOF 字符时程序终止。

当我在我的 IDE (Code::Blocks 16.01) 中运行代码并输入一个字符串时, 例如:嗨!我叫 C。\n

输出显示在 '\n' 之后,而不是同时显示。 输出不应该是 - "HHii!! MMyy nnaammee iiss CC..”?

粗体字母表示输出。

【问题讨论】:

  • putchar() 返回后,字符被保存在内部缓冲区中,直到程序退出/完成。
  • @ManmeetP 然后按“回车”会冲出缓冲区?
  • #include &lt;stdio.h&gt; int main (void) { int c; while ( (c = getchar ()) != EOF ) putchar (c); return 0; }
  • 你能尝试一下上面的程序结构吗?请分享输出。
  • 试试fflush(stdout);

标签: c stdin


【解决方案1】:

包括:

#include <unistd.h>
#include <termios.h>

在主插入代码之前:

struct termios term, term_orig;
if(tcgetattr(STDIN_FILENO, &term_orig)) {
        printf("tcgetattr failed\n");
        return -1;
    }
term = term_orig;
term.c_lflag &= ~ICANON;
if (tcsetattr(STDIN_FILENO, TCSANOW, &term)) {
    printf("tcsetattr failed\n");
    return -1;

}

在你的代码插入之后:

if (tcsetattr(STDIN_FILENO, TCSANOW, &term_orig)) {
    printf("tcsetattr failed\n");
   return -1;
}

【讨论】:

    【解决方案2】:

    因为默认情况下,来自终端的输入是行缓冲的。所以你的程序在你按下 Enter 后会得到一整行。

    要在 Unix 和 Linux 系统中禁用缓冲,试试这个:

    #include <unistd.h>
    #include <termios.h>
    
    int disableLineBuffer(void){
        struct termios term, oldterm;
        if (tcgetattr(STDIN_FILENO, &term)) return -1;
        oldterm = term;
        term.c_lflag &= ~(ECHO | ICANON);
        if (tcsetattr(STDIN_FILENO, TCSANOW, &term)) return -1;
        return 0;
    }
    

    在 Windows 中,改为执行以下操作:

    #include <windows.h>
    
    BOOL WINAPI DisableLineBuffer(void){
        HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
        DWORD mode;
        if (!GetConsoleMode(hInput, &mode)) return FALSE;
        mode &= ~ENABLE_LINE_INPUT;
        if (!SetConsoleMode(hInput, mode)) return FALSE;
        return TRUE;
    }
    

    请务必在您的程序退出之前恢复对控制台的更改,否则您可能无法在终端中执行其他任何操作。

    【讨论】:

      猜你喜欢
      • 2019-12-23
      • 2015-07-28
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多