最近写一段程序,因为刚学linux学习网络编程,编个聊天软件(有一个功能就是可以选择让对方显示自己的输入过程),因为打算在输入字符前面加上昵称,因此我计划是通过判断键盘输入来确定是否要输入信息,在网上找了关于这方面的内容,其中最多的就是各种kbhit()函数在linux中实现,最开始是做的是这样做的:
首先,在网上找到了kbhit()函数的实现:
int kbhit(void)
{
struct termios oldt, newt;
int ch;
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch, stdin);
return 1;
}
return 0;
}
因为上述函数肯定在输入时肯定会在屏幕上显示出来,为了不让其显示,在ch = getchar(); 前面加上一句system('stty -echo");并用一个全局变量c将ch字符保存起来,
然后在程序中调用大概流程是:
while(1)
{
if(kbhit())
{
cout<<name<<":"<<c;
.......
}
}
但是这个程序不对,因为在输入过程中还是会在屏幕上显示,而且不知道为什么以后c的值保持不变,而且kbhit()返回值都是1,即使我不按键的时候都是,这个把我纠结半天,然后网上寻求答案,可能是经验问题,没有找到,最后阴差阳错,在不让对方显示自己的输入过程时用到gets()函数就可以了,所以在这个程序中将 cout<<name<<":"<<c;
改为getc(stdin);然后就好了,后来上网查找原因,感觉应该和gets()/getc()输入机制有关,因为编程经验和对系统机制知识不足,具体原因我也不是很清楚,所以写这篇文章是希望像我这样的初学者能够很好的解决一些问题,同时也希望大神们知道答案的请私信我,告诉我答案,我会非常感谢的!
最后祝大家愉快!