user-0 提问: Linux程序中如何才能：按键后，程序直接响应，而无需再按回车键？

回复:
user: user-0
content: 嗯嗯……我来结帖，也总结一下。 使用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; } 原理就是更改终端的设置，但用完一定要在改回来。

user: user-1
content: 使用NCURSES库

user: user-2
content: 引用 7 楼 aningsk 的回复:[quote=引用 6 楼 zjq9931 的回复:] [quote=引用 4 楼 aningsk 的回复:] [quote=引用 2 楼 zjq9931 的回复:] [quote=引用 楼主 aningsk 的回复:] 在Linux环境中，编写程序，需要使用键盘的方向键。 我使用getchar()来接收键盘的输入，但每次必须按回车后，getchar()才会真正接收到我的键盘输入。 （使用scanf()也是这个情况：必须回车后，程序才真正得到数据。）  例如： while (c = getchar()) {        //getchar();        printf("c=%d\n", c); } 上面的程序，无论我键盘输入多少，不按回车是没有printf的。一回车，之前的输入才会print出来。  所以想问一下，有没有什么方法可以按键后，程序能立即获得此按键输入啊？不用等待再按一下回车键。 用getch()这个函数[/quote] Linux 里有这个函数吗？ man getch 没有结果啊[/quote] 我没有用过linux环境，但是在网上查了一下： Linux--getch()的使用 在 Linux 下使用 getch()需要 ncurses 库的支持,该库包含 ncurses 和 ncurses-devel 两大包 [/quote] 这个库我之前安过，好像make menuconfig必须用这个库的， 那它的头文件是啥啊？[/quote] 这里有： http://wenku.baidu.com/link?url=fQDQ1SyUXPApKW15nXC3pdCfNLAFqswRpKa-7TafHmzmQSLp8yPDjhh0wZUWTEALNoVbwq-78FPcg6PWZ7PwYcP4PBdUZQu1HbRii9fG_am

user: user-0
content: 引用 6 楼 zjq9931 的回复:[quote=引用 4 楼 aningsk 的回复:] [quote=引用 2 楼 zjq9931 的回复:] [quote=引用 楼主 aningsk 的回复:] 在Linux环境中，编写程序，需要使用键盘的方向键。 我使用getchar()来接收键盘的输入，但每次必须按回车后，getchar()才会真正接收到我的键盘输入。 （使用scanf()也是这个情况：必须回车后，程序才真正得到数据。）  例如： while (c = getchar()) {        //getchar();        printf("c=%d\n", c); } 上面的程序，无论我键盘输入多少，不按回车是没有printf的。一回车，之前的输入才会print出来。  所以想问一下，有没有什么方法可以按键后，程序能立即获得此按键输入啊？不用等待再按一下回车键。 用getch()这个函数[/quote] Linux 里有这个函数吗？ man getch 没有结果啊[/quote] 我没有用过linux环境，但是在网上查了一下： Linux--getch()的使用 在 Linux 下使用 getch()需要 ncurses 库的支持,该库包含 ncurses 和 ncurses-devel 两大包 [/quote] 这个库我之前安过，好像make menuconfig必须用这个库的， 那它的头文件是啥啊？

user: user-2
content: 引用 4 楼 aningsk 的回复:[quote=引用 2 楼 zjq9931 的回复:] [quote=引用 楼主 aningsk 的回复:] 在Linux环境中，编写程序，需要使用键盘的方向键。 我使用getchar()来接收键盘的输入，但每次必须按回车后，getchar()才会真正接收到我的键盘输入。 （使用scanf()也是这个情况：必须回车后，程序才真正得到数据。）  例如： while (c = getchar()) {        //getchar();        printf("c=%d\n", c); } 上面的程序，无论我键盘输入多少，不按回车是没有printf的。一回车，之前的输入才会print出来。  所以想问一下，有没有什么方法可以按键后，程序能立即获得此按键输入啊？不用等待再按一下回车键。 用getch()这个函数[/quote] Linux 里有这个函数吗？ man getch 没有结果啊[/quote] 我没有用过linux环境，但是在网上查了一下： Linux--getch()的使用 在 Linux 下使用 getch()需要 ncurses 库的支持,该库包含 ncurses 和 ncurses-devel 两大包

user: user-0
content: 引用 3 楼 aningsk 的回复:[quote=引用 1 楼 user-3 的回复:] 你要刷新 缓冲区啊~~~~ 用fflush(stdio);吗？稍等，我现在试一下~[/quote]  试过了。。。 无效啊。。。

user: user-0
content: 引用 2 楼 zjq9931 的回复:[quote=引用 楼主 aningsk 的回复:] 在Linux环境中，编写程序，需要使用键盘的方向键。 我使用getchar()来接收键盘的输入，但每次必须按回车后，getchar()才会真正接收到我的键盘输入。 （使用scanf()也是这个情况：必须回车后，程序才真正得到数据。）  例如： while (c = getchar()) {        //getchar();        printf("c=%d\n", c); } 上面的程序，无论我键盘输入多少，不按回车是没有printf的。一回车，之前的输入才会print出来。  所以想问一下，有没有什么方法可以按键后，程序能立即获得此按键输入啊？不用等待再按一下回车键。 用getch()这个函数[/quote] Linux 里有这个函数吗？ man getch 没有结果啊

user: user-0
content: 引用 1 楼 user-3 的回复:你要刷新 缓冲区啊~~~~ 用fflush(stdio);吗？稍等，我现在试一下~

user: user-2
content: 引用 楼主 aningsk 的回复:在Linux环境中，编写程序，需要使用键盘的方向键。 我使用getchar()来接收键盘的输入，但每次必须按回车后，getchar()才会真正接收到我的键盘输入。 （使用scanf()也是这个情况：必须回车后，程序才真正得到数据。）  例如： while (c = getchar()) {        //getchar();        printf("c=%d\n", c); } 上面的程序，无论我键盘输入多少，不按回车是没有printf的。一回车，之前的输入才会print出来。  所以想问一下，有没有什么方法可以按键后，程序能立即获得此按键输入啊？不用等待再按一下回车键。 用getch()这个函数

user: user-3
content: 你要刷新 缓冲区啊~~~~