当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : linux下如何响应按键?
帖子发表于 : 2009-04-05 16:20 

注册: 2009-04-05 16:16
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
请问:

在linux下的C编程环境中,如何响应按键消息,而不是通过getchar()函数呢?

谢谢!

:em20


页首
 用户资料  
 
2 楼 
 文章标题 : Re: linux下如何响应按键?
帖子发表于 : 2009-04-05 16:23 

注册: 2009-04-05 16:16
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <string.h>

void changemode(int);
int kbhit(void);


int main(void)
{
char str[500]="";
int num = 0;
int count = 0;
char ch;

printf("enter?:");

changemode(1);
while(1)
{
if( kbhit() )
{
ch = getchar();
putchar(ch);

if(ch != '\n')
str[num++] = ch;
else{
str[num] = '\0';
break;
}
}
}
printf("read:%s\n", str);

changemode(0);
return 0;
}


void changemode(int dir)
{
static struct termios oldt, newt;

if ( dir == 1 )
{
tcgetattr( STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
}
else
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}


int kbhit (void)
{
struct timeval tv;
fd_set rdfs;

tv.tv_sec = 0;
tv.tv_usec = 0;

FD_ZERO(&rdfs);
FD_SET (STDIN_FILENO, &rdfs);

select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
return FD_ISSET(STDIN_FILENO, &rdfs);
}

我试了下以上程序,在终端运行,可出现的问题是:
按了一个键,它只能在你再敲一个键时才显示出来,不然它就一直不显示,为什么啊?


页首
 用户资料  
 
3 楼 
 文章标题 : Re: linux下如何响应按键?
帖子发表于 : 2009-04-08 15:27 

注册: 2009-04-05 16:16
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
怎么没人帮下忙啊?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: linux下如何响应按键?
帖子发表于 : 2009-04-12 20:56 
头像

注册: 2006-09-21 14:28
帖子: 2376
送出感谢: 0 次
接收感谢: 0 次
linux程序设计
第三版



C专家编程

都提及了


_________________
http://lee.youxu.info/


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译