“如何避免Entergetchar()
压着?”
首先,终端输入通常是线路或完全缓冲的。这意味着操作系统将来自终端的实际输入存储到缓冲区中。\n
通常,当 fe在 中发出信号/提供时,此缓冲区会刷新到程序中stdin
。这是 fe 制作的Enter。
getchar()
只是在链的末端。它无法实际影响缓冲过程。
“我怎么能这样? ”
首先getchar()
放弃,如果您不想使用特定的系统调用来明确更改终端的行为,就像其他答案中很好解释的那样。
不幸的是,没有标准库函数,也没有可移植的方法来在单个字符输入时刷新缓冲区。但是,也有基于实现的和不可移植的解决方案。
在 Windows/MS-DOS 中,头文件中有getch()
和getche()
函数conio.h
,它们完全符合您的要求 - 读取单个字符而无需等待换行符刷新缓冲区。
getch()
和之间的主要区别在于getche()
它getch()
不会立即在控制台中输出实际的输入字符,而getche()
会。附加"e"
代表echo。
例子:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int c;
while ((c = getche()) != EOF)
{
if (c == '\n')
{
break;
}
printf("\n");
}
return 0;
}
在Linux 中,获得直接字符处理和输出的一种方法是使用ncurses 库中的cbreak()
andecho()
选项和getch()
andrefresh()
例程。
请注意,您需要使用 初始化所谓的标准屏幕,并使用例程initscr()
关闭它。endwin()
例子:
#include <stdio.h>
#include <ncurses.h>
int main (void)
{
int c;
cbreak();
echo();
initscr();
while ((c = getch()) != ERR)
{
if (c == '\n')
{
break;
}
printf("\n");
refresh();
}
endwin();
return 0;
}
注意:您需要使用该-lncurses
选项调用编译器,以便链接器可以搜索并找到 ncurses-library。