以下有两种,其实就是一种,都是通过更改终端的设置,但用完一定要在改回来,第一种是封装好了getch(),第二种没有封装。
termios结构的描述了终端的模式,在这段代码中我们改变了它,使得终端能够接收到键盘输入马上返回。
使用getch(),需要NCURSES库,但对这个库我不是很了解。使用时,要#include <curses.h>;编译时,要gcc test.c -l curses。根据zjq9931提供的百度文库资料,里面有两个例子,发现第一个例子直接使用的curses,效果不是很好。但第二个例子是我想要的效果(重新封装了getch())。大家可以参考zjq9931给出的链接。
我也把我写的代码放在这里供大家参考:
(其实就是参考zjq9931贴出的链接中的例2)
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <assert.h>
#include <string.h>
int getch(void);
int main(void)
{
char c = 0;
while (1) {
fflush(stdin);
c = getch();
printf("c = %d\n", c);
}
return 0;
}
int getch(void)
{
int c = 0;
int res = -1;
struct termios org_opts, new_opts;
res = tcgetattr(STDIN_FILENO, &org_opts);
assert(res == 0);
memcpy(&new_opts, &org_opts, sizeof(org_opts));
new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE);
tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
c = getchar();
res = tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
assert(res == 0);
return c;
}
原理就是更改终端的设置,但用完一定要在改回来。
2.windows下面有 getch() 可以直接输入一个字符,而不需按回车。
Linux下如果想直接输入一个字符,只能使用getchar() ,而且要按回车才能触发输入,否则会一直阻塞在输入这里。网上找到一个解决办法,稍加改进,能实现跟windows下 getch() 一样的效果。
代码如下:添加头文件就可以直接使用了。