如果用户在几秒钟内没有输入输入,我有这个程序应该结束并打印一条消息。但是现在虽然我的代码看似合乎逻辑,但时间限制似乎并没有起作用。 (如果用户没有输入任何内容,时间不会消失)为什么会这样?
AudioClip
答案 0 :(得分:1)
不提供保修,但如果使用_kbhit
是解决方案的一部分,那么您可能只想在检测到某些键盘活动时尝试阅读。
int userInput = 0;
int now = time(0);
int later = 0;
int elapsed = 0;
cout << "Enter number" <<endl;
do {
later = time(0);
elapsed = later - now;
if(_kbhit()) { // we **may** have some input
cin >> userInput;
// this is useless for timing purposes!!
// A simple `break` should suffice.
switch(userInput)
{
case 1:
elapsed = 0;
break;
}
}
} while (elapsed < 4);
if (elapsed == 4)
{
system("cls");
cout << "Too Slow!! Now You're on the Menu!";
return 0;
}
答案 1 :(得分:0)
这是因为operator>>
等待输入输入。完全停止。
cin >> userInput;
此时,由于标准输入是交互式终端,程序会暂停,直到输入内容为止。无论是几分钟,几小时还是几天。程序被杀死,或输入内容后跟 Enter 。没有其他结果。
只是因为程序中的某些其他代码设置了某种计时器,或者诸如此类,并没有改变这个基本事实。在收到一行输入之前,没有其他任何东西会被执行。
要实现这种超时,必须使用特定于操作系统的系统调用,直到标准输入可用或计时器到期为止。这超出了C ++标准的范围。
答案 2 :(得分:0)
问题是cin >>
阻止并等待。
这里有几个选项,但想到的就是使用不等待的_kbhit()
和_getch()
来推送自己的选项。伪代码:
string inputStr = "";
while (elapsed time < time limit) {
if (_kbhit()) {
int ch = _getch();
if ch is a carriage return then break;
otherwise append ch to inputStr;
}
}
int inputNumber = convert inputStr to an int;
根据您的具体要求调整逻辑,但您明白了。
注意:我不确定这是否有效;请随时在评论中确认或撕开。我现在无法测试它。我使用这些函数已经有一段时间了,如果缓冲区中有输入,或者它是否会清除缓冲区,或者某些奇怪的非stdin控制台依赖的东西,我不确定_getch()
是否会立即返回, 或者是什么。