你好我正在研究一个正在检查用户输入并要求用户重新输入的程序,如果数据与程序正在寻找的类型不匹配(在这种情况下我正在寻找双数据类型)。以下是我目前的代码。
#include <iostream>
using namespace std;
int main()
{
//Declare Variables and define.
double var1,
var2,
var3,
var4,
var5,
sum,
avg;
cout << "Input Five Values to be averaged. Press Enter to Continue" << endl;
do {
cin.clear();
cin.ignore();
cout << "Input first value:" << endl;
cin >> var1;
} while(cin.fail());
do {
cin.clear();
cin.ignore();
cout << "Input second value:" << endl;
cin >> var2;
} while (cin.fail());
do {
cin.clear();
cin.ignore();
cout << "Input third value:" << endl;
cin >> var3;
} while (cin.fail());
do {
cin.clear();
cin.ignore();
cout << "Input Fouth value:" << endl;
cin >> var4;
} while (cin.fail());
do {
cin.clear();
cin.ignore();
cout << "Input fifth value:" << endl;
cin >> var5;
} while (cin.fail());
//Sum the values.
sum = var1 + var2 + var3 + var4 + var5;
//Calculate the Average of Sum.
avg = sum / 5;
// Display the results.
cout << "The average is: " << avg << endl;
system("pause");
return 0;
}
当我输入&#34; aa&#34;,&#34; s2&#34;,&#34; 2ss&#34;时出现问题。它不会再次要求数据一次,但是因为很多字符都在cin中,或者在&#34; s2&#34; /&#34; 22s&#34;它将转到下一个输入请求。为什么会发生这种情况?如何纠正这种行为?
提前谢谢!
答案 0 :(得分:1)
使用:
而不是cin.ignore();
cin.ignore(std::numberic_limits<std::streamsize>::max(), '\n');
这将忽略256个字符或每个字符,直到换行符(以先到者为准)。截至目前,您只清除缓冲区中的一个字符,正如您所发现的那样 - 并不总是足够。
感谢@Arnav和@Dietmar要忽略的正确字符数!
答案 1 :(得分:0)
另一个更好的答案解释了如何让它停止。这就是它发生的原因:
double d;
cin >> d;
将阅读尽可能多的&#34;双重&#34;字符尽可能然后停止。所以,例如,如果您输入&#34; 2ss&#34;提取器会消耗&#34; 2&#34;并将get指针留在第一个&#39;。如果你输入&#34; aa&#34;提取器什么都不消耗。额外字符(以及换行符)会发生什么变化取决于你。
由于你没有消耗输入缓冲区中的所有字符,当循环循环时,其余一个字符被ignore()消耗,你再次尝试,直到它们全部消失。
您尝试实现的实际要求是,只能在一行上输入一个数字(在这种情况下,建议使用getline / strod),或者应该静静地吞下一行中的所有无关字符,在这种情况下,更精确的ignore()规范是正确的。