为什么按下回车键后显示输入?

时间:2017-11-16 06:18:50

标签: c stdin

{{1}}

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

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

输出显示在' \ n'之后而不是同时。 输出应该是 - " H H i i M M y y n n a a m m e e i s s C C "?

粗体字母表示输出。

2 个答案:

答案 0 :(得分:0)

包括:

#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;
}

答案 1 :(得分:0)

因为默认情况下,来自终端的输入是行缓冲。因此,按Enter键后,您的程序将获得整行。

在Unix&amp;中禁用缓冲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;
}

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

相关问题