“如何避免按下Enter与getchar()
? ”
首先,终端输入通常是线路输入或完全缓冲的。这意味着操作系统会将来自终端的实际输入存储到缓冲区中。通常,当fe\n
在/中提供信号时,此缓冲区将刷新到程序stdin
。这是新闻界对Enter。
getchar()
只是在链的尽头。它没有能力真正影响缓冲过程。
“我该怎么办? ”
沟渠 getchar()
摆在首位,如果你不想将使用特定的系统调用来改变终端的明确像其他的答案很好地解释的行为。
不幸的是,没有标准的库函数,也没有可移植的方式在单字符输入时刷新缓冲区。但是,存在基于实现的非便携式解决方案。
在Windows / MS-DOS,还有getch()
和getche()
在功能conio.h
头文件中,它们确实可以完成您想要的事情-读取单个字符而无需等待换行符刷新缓冲区。
之间的主要区别getch()
和getche()
是getch()
不会立即输出在控制台的实际输入字符,而getche()
做。附加"e"
代表回声。
例:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int c;
while ((c = getche()) != EOF)
{
if (c == '\n')
{
break;
}
printf("\n");
}
return 0;
}
在Linux中,获取直接字符处理和输出的一种方法是使用cbreak()
和echo()
选项以及getch()
和和refresh()
ncurses-library中例程。
请注意,您需要使用来初始化所谓的标准屏幕,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。