作者:fbysss
msn:jameslastchina@hotmail.com
blog:blog.youkuaiyun.com/fbysss
声明:本文由fbysss整理编写,转载请注明出处
关键字:getch
问题1:标准c中没有getch函数,等待键盘输入之后,总是需要按下回车才能得到值,如何解决?
问题2:在等待键盘输入的时候,程序被阻塞了,下面的代码必须在输入处理之后才能执行。如果不使用线程,如何实现非阻塞模式?
解决办法:
#include <curses.h>
#include <fcntl.h>
int main()
...{
int ch;

WINDOW * win= initscr(); /**//* 开始curses模式 */
scrollok(win,TRUE); /**//*设置屏幕可滚动,否则超出一屏之后显示不完全*/
//raw(); /* 禁用行缓冲 */
keypad(stdscr, TRUE); /**//* 开启功能键响应模式 */
noecho(); /**//* 当执行getch()函数的时候关闭键盘回显 */
//fcntl(0,F_SETFL, O_NONBLOCK);//这句用于设置非阻塞模式。即在侦测键盘输入的同时,不影响getch后面语句的执行。本函数位于头文件fcntl.h中
while(1)...{
printw("Type any character to see it in bold ");

ch = getch(); /**//* 原注:如果没有调用raw()函数,必须按下enter键才可以执行下面的程序
实验结果表明,使用了raw()之后同样不需要回车就可以执行下去。另外,如果使用了raw(),ctrl+c也会被捕获*/

if(ch == KEY_F(1)) /**//* 如果没有调用keypad()初始化,将不会执行这条语句 */
...{
printw("F1 Key pressed"); /**//* 如果没有使用 noecho() 函数,一些难看的控制字符将会被打印到屏幕上 */
}
else if(ch!=-1)
...{
printw("The pressed key is ");
attron(A_BOLD);
printw("char:%c,intvalue:%d", ch,ch);
attroff(A_BOLD);
}
refresh(); /**//* 将缓冲区的内容打印到显示器上 */
}


endwin(); /**//* 结束curses模式 */
return 0;
}
注:用gcc编译的时候要注意一点,必须加上-lcurses参数,否则会出现undefined reference to `initscr'等等一大堆错误信息
本文介绍如何在C语言中实现非阻塞键盘输入,通过使用curses库,可以实现在程序运行时不被键盘输入阻塞,并且能够即时响应键盘输入。文中还介绍了如何配置curses库来禁用行缓冲、启用功能键响应、关闭键盘回显等。
431

被折叠的 条评论
为什么被折叠?



