{{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 。。"?
粗体字母表示输出。
答案 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;
}
请务必在程序退出之前将更改还原到控制台,否则您可能无法在终端中执行任何其他操作。