我正在编写一个C程序,使用ncurses在终端上打印一些东西。用户按's'时应该停止打印,按's'再次继续打印。如何在不等待用户按键的情况下从输入中读取密钥?
我尝试了getch()
和getchar()
,但他们等到按下某个键...
修改
这是我的代码:
int main(void)
{
initscr(); /* Start curses mode */
refresh(); /* Print it on to the real screen */
int i = 0, j = 0;
int state = 0;
while (1)
{
cbreak();
int c = getch(); /* Wait for user input */
switch (c)
{
case 'q':
endwin();
return 0;
case 'c':
state = 1;
break;
case 's':
state = 0;
break;
default:
state = 1;
break;
}
if(state)
{
move(i, j);
i++;
j++;
printf("a");
refresh();
}
}
nocbreak();
return 0;
}
编辑2 这很好用。我得到了100分:)
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
int main(void)
{
initscr();
noecho();
cbreak(); // don't interrupt for user input
timeout(500); // wait 500ms for key press
int c = 0; // command: [c|q|s]
int s = 1; // state: 1= print, 0= don't print ;-)
int i = 0, j = 0;
while (c != 'q')
{
int c = getch();
switch (c)
{
case 'q':
endwin();
return 0;
case 'c':
s = 1;
break;
case 's':
s = 0;
break;
default:
break;
}
if (s)
{
move(i, j);
printw("a");
i++;
j++;
}
}
endwin();
nocbreak();
return 0;
}
答案 0 :(得分:4)
ncurses有能力通过它自己的getch()函数来完成这项工作。请参阅this页面
#include <curses.h>
int main(void) {
initscr();
timeout(-1);
int c = getch();
endwin();
printf ("%d %c\n", c, c);
return 0;
}
答案 1 :(得分:0)
我相信在comp.lang.c fAQ中有一个答案。我目前无法加载网站,但请查看“系统依赖关系”部分。
答案 2 :(得分:0)
由于您正在使用ncurses,因此首先调用cbreak
来关闭行缓冲。然后你会打电话给nodelay
告诉它不要在返回之前等待 - getch
将永远立即返回。如果是这样,你将检查是否按下了一个键,如果是,那么键是什么键(并做出适当的反应)。