
c++中kbhit的多次调用问题,求教啊!!
#include<iostream>#include<ctime>#include<windows.h>/*包含system("cls"),用于清屏*/#include<...
#include <iostream>
#include <ctime>
#include <windows.h> /*包含system("cls"),用于清屏*/
#include <conio.h> /*包含kbhit函数*/
using namespace std;
int main()
{
int t1;
t1=clock()/CLK_TCK; /*从系统中读取时间,并转换成秒*/
for(;clock()/CLOCKS_PER_SEC-t1<10;) /*若无键按下,10秒之后结束显示*/
{
cout<<"morning 早上"<<endl;
system("cls");
if(_kbhit()) break; /*有键按下,结束显示*/
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"afternoon 下午"<<endl;
system("cls");
if(_kbhit()) break;
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"evening 晚上"<<endl;
system("cls");
if(_kbhit()) break;
}
return 0;
}
程序就是上面那个,显示“早上”的时候,如果按下键,能正常跳出循环,但是后面“下午”和“晚上“马上就一闪而过,跳出了循环。不知道是不是按下键之后,kbhit的值没有复位?kbhit不是只从当前键盘读值吗?到底怎么回事啊。解决后加分 展开
#include <ctime>
#include <windows.h> /*包含system("cls"),用于清屏*/
#include <conio.h> /*包含kbhit函数*/
using namespace std;
int main()
{
int t1;
t1=clock()/CLK_TCK; /*从系统中读取时间,并转换成秒*/
for(;clock()/CLOCKS_PER_SEC-t1<10;) /*若无键按下,10秒之后结束显示*/
{
cout<<"morning 早上"<<endl;
system("cls");
if(_kbhit()) break; /*有键按下,结束显示*/
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"afternoon 下午"<<endl;
system("cls");
if(_kbhit()) break;
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"evening 晚上"<<endl;
system("cls");
if(_kbhit()) break;
}
return 0;
}
程序就是上面那个,显示“早上”的时候,如果按下键,能正常跳出循环,但是后面“下午”和“晚上“马上就一闪而过,跳出了循环。不知道是不是按下键之后,kbhit的值没有复位?kbhit不是只从当前键盘读值吗?到底怎么回事啊。解决后加分 展开
3个回答
展开全部
#include <iostream>
#include <ctime>
#include <windows.h> /*包含system("cls"),用于清屏*/
#include <conio.h> /*包含kbhit函数*/
using namespace std;
int main()
{
int t1;
t1=clock()/CLK_TCK; /*从系统中读取时间,并转换成秒*/
for(;clock()/CLOCKS_PER_SEC-t1<10;) /*若无键按下,10秒之后结束显示*/
{
cout<<"morning 早上"<<endl;
system("cls");
if(_kbhit())
{
getch () ;
break ;
}
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"afternoon 下午"<<endl;
system("cls");
if(_kbhit())
{
getch () ;
break ;
}
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"evening 晚上"<<endl;
system("cls");
if(_kbhit())
{
getch ();
break ;
}
}
return 0;
}
改成这样试试。
getch()和_kbhit()都是直接从键盘读数据,所以把输入的字符用getch()接收并丢弃掉,不然只要输入一次,后面的所有的_kbhit()都返回真了。
以上结论是我猜测的,做了几个实验,不知道正确不正确。
#include <ctime>
#include <windows.h> /*包含system("cls"),用于清屏*/
#include <conio.h> /*包含kbhit函数*/
using namespace std;
int main()
{
int t1;
t1=clock()/CLK_TCK; /*从系统中读取时间,并转换成秒*/
for(;clock()/CLOCKS_PER_SEC-t1<10;) /*若无键按下,10秒之后结束显示*/
{
cout<<"morning 早上"<<endl;
system("cls");
if(_kbhit())
{
getch () ;
break ;
}
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"afternoon 下午"<<endl;
system("cls");
if(_kbhit())
{
getch () ;
break ;
}
}
t1=clock()/CLK_TCK;
for(;clock()/CLOCKS_PER_SEC-t1<10;)
{
cout<<"evening 晚上"<<endl;
system("cls");
if(_kbhit())
{
getch ();
break ;
}
}
return 0;
}
改成这样试试。
getch()和_kbhit()都是直接从键盘读数据,所以把输入的字符用getch()接收并丢弃掉,不然只要输入一次,后面的所有的_kbhit()都返回真了。
以上结论是我猜测的,做了几个实验,不知道正确不正确。
追问
确实可行!加了之后就没问题了,但是为什么百度全说kbhit是非阻塞性,只会检测当时键盘按键,不会记忆,你知道这个原理么?
展开全部
键盘的按键传送给程序是有一套流程的。
键盘上有按键产生,首先会保存到键盘输入缓冲区,再由程序从缓冲区读取键盘具体按键,比如gechar就是这样的;程序也乐意直接获取按键,比如getch
kbhit是直接检测按键是否发生!
键盘上有按键产生,首先会保存到键盘输入缓冲区,再由程序从缓冲区读取键盘具体按键,比如gechar就是这样的;程序也乐意直接获取按键,比如getch
kbhit是直接检测按键是否发生!
更多追问追答
追问
是啊,为什么kbhit会记忆按键值呢?我第一次按了,后面两次我不按他自己判断为真
追答
原因不是它能记忆键值,你把缓冲区理解为一段内存,键盘按键存在里面,而kbhit只是检测,并不会清掉缓冲区里面的键值。所以它每次进入缓冲区检测到的都是原来按下的那个键值,像getch,getchar在缓冲区获取字符后,缓冲区的字符就被取走了。
所以kbhit只是充当眼睛的角色,getch,getchar才是手!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询