我有一个生成随机数的程序,并要求用户继续猜测,直到他/她做对了。我希望它继续接受新值,即使我通过处理错误情况错误地输入任何其他数据类型。
我的问题是,当我尝试运行以下程序时,一旦我输入一个字符并按下回车,它就会进入一个无限循环。我尝试使用cin.ignore()和cin.clear(),但这只是让程序在第一次输入后停止。
有谁能帮助我了解正在发生的事情以及如何实现所需的输出?提前谢谢。
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
int main()
{
int secret_num, guess;
srand(time(NULL));
secret_num=rand() % 101 + 0;
cout<<"Enter your guess between 0 and 100: ";
do
{
if(!(cin>>guess))
{
cout<<" The entered value is not an integer"<<endl;
}
else if( isnumber(guess))
{
if(guess>secret_num)
cout<<"Too high";
else if(guess<secret_num)
cout<<"too low";
cout<<endl;
}
}
while(secret_num!=guess);
if((guess==secret_num)| (isnumber(guess)))
{
cout<<"yes the correct number is "<<secret_num<<endl;
}
return 0;
}
编辑:这是我输入字符后输入数字时cin.clear()和cin.ignore(1000,&#39; \ n&#39;)输出的截图两次。
答案 0 :(得分:1)
if (!(cin >> guess))
{
cout << " The entered value is not an integer" << endl;
cin.clear(); // clear must go before ignore
// Otherwise ignore will fail (because the stream is still in a bad state)
cin.ignore(std::numeric_limits<int>::max(), '\n');
}
默认情况下,cin.ignore会忽略单个字符。如果他们输入超过1个字符,那就不够了,这就是为什么我对它进行了一些修改。
if ((guess == secret_num) | (isnumber(guess)))
|
是一个按位运算符[OR]
||
是逻辑运算符[OR]
但我认为你真正想要的是&&
(AND)
if ((guess == secret_num) && (isnumber(guess)))
答案 1 :(得分:1)
有几个问题。
您应该使用@ {José建议的cin.clear()
和cin.ignore()
。
什么是isnumber()
?我猜它正在返回false
所以没有打印出提示消息(即“太高”和“太低”),看起来它停止了,虽然它只是在等待下一个输入。并isnumber()
对我没有意义。 guess
已被声明为int
,它必须是一个数字,不是吗?
if((guess==secret_num)| (isnumber(guess)))
。在用户输入正确的数字之前,循环不会结束,这个条件应该已经得到满足。
答案 2 :(得分:0)
您可以使用clear和flush
if(!(cin>>guess))
{
cout<<" The entered value is not an integer"<<endl;
cin.clear();
fflush(stdin);
}
如果您正在从控制台阅读,则此功能正常。否则你可以和@José一起回答。
答案 3 :(得分:0)
我会改变循环中的逻辑,因为有一些无用的测试。这对我有用:
#include <iostream>
#include <limits>
#include <cstdlib> // You may take a look at <random> and <chrono>
#include <time.h>
using std::cout;
using std::cin;
int main() {
srand(time(NULL));
int secret_num = rand() % 101;
cout << secret_num << '\n';
cout << "Enter your guess between 0 and 100:\n";
int guess = -1;
do {
cin >> guess;
if ( cin.eof() )
break;
if ( cin.fail() ) {
cout << "The entered value is not an integer, please retry.\n";
// clear the error flag
cin.clear();
// ignore the rest of the line
cin.ignore(std::numeric_limits<int>::max(),'\n');
// clear the value of the variable
guess = -1;
continue;
}
// now we know that guess is a number
if ( guess > secret_num )
cout << "Too high\n";
else if ( guess < secret_num )
cout << "Too low\n";
else {
cout << "Yes the correct number is " << secret_num << std::endl;
break;
}
} while ( true );
return 0;
}