我试图提示用户输入并进行验证。例如,我的程序必须输入3个用户输入。一旦它达到非整数,它将打印错误消息并再次提示输入。以下是我的程序在运行时的样子:
输入数字:a
输入错误
输入数字:1
输入数字:b
输入错误
输入数字:2
输入数字:3
输入的数字是1,2,3
这是我的代码:
double read_input()
{
double input;
bool valid = true;
cout << "Enter number: " ;
while(valid){
cin >> input;
if(cin.fail())
{
valid = false;
}
}
return input;
}
我的主要方法:
int main()
{
double x = read_input();
double y = read_input();
double z = read_input();
}
当我的第一个输入是非整数时,程序就会自行退出。它不再要求提示。我怎么能修好它?或者我应该使用do while循环,因为我要求用户输入。
提前致谢。
答案 0 :(得分:7)
当阅读失败时,您将valid
设置为false
,因此while
循环中的条件为false
,程序返回input
(其中顺便说一下,没有初始化。
您还必须在再次使用之前清空缓冲区,例如:
#include <iostream>
#include <limits>
using namespace std;
double read_input()
{
double input = -1;
bool valid= false;
do
{
cout << "Enter a number: " << flush;
cin >> input;
if (cin.good())
{
//everything went well, we'll get out of the loop and return the value
valid = true;
}
else
{
//something went wrong, we reset the buffer's state to good
cin.clear();
//and empty it
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout << "Invalid input; please re-enter." << endl;
}
} while (!valid);
return (input);
}
答案 1 :(得分:0)
你的问题确实让自己陷入了其他问题,例如在失败时清除cin() -
double read_input()
{
double input;
int count = 0;
bool valid = true;
while(count != 3) {
cout << "Enter number: " ;
//cin.ignore();
cin >> input;
if(cin.fail())
{
cout << "Wrong Input" <<endl;
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
else
count++;
}
return input;
}
答案 2 :(得分:0)
问题出在while条件
bool valid = true;
while(valid){
你循环直到你得到一个无效的输入,这绝对不是你想要的!循环条件应该是这样的
bool valid = false;
while(! valid){ // repeat as long as the input is not valid
以下是read_double
double read_input()
{
double input;
bool valid = false;
while(! valid){ // repeat as long as the input is not valid
cout << "Enter number: " ;
cin >> input;
if(cin.fail())
{
cout << "Wrong input" << endl;
// clear error flags
cin.clear();
// Wrong input remains on the stream, so you need to get rid of it
cin.ignore(INT_MAX, '\n');
}
else
{
valid = true;
}
}
return input;
}
在您的主要内容中,您需要根据需要提出双打要求,例如
int main()
{
double d1 = read_input();
double d2 = read_input();
double d3 = read_input();
cout << "Numbers entered are: " << d1 << ", " << d2 << ", " << d3 << endl;
return 0;
}
您可能还希望有一个循环,您可以在其中调用read_double()
并将返回的值保存在数组中。