C ++检查cin的输入以获取正确的数据

时间:2018-01-31 00:43:12

标签: c++ cin

你好我正在研究一个正在检查用户输入并要求用户重新输入的程序,如果数据与程序正在寻找的类型不匹配(在这种情况下我正在寻找双数据类型)。以下是我目前的代码。

#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;它将转到下一个输入请求。为什么会发生这种情况?如何纠正这种行为?

提前谢谢!

2 个答案:

答案 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()规范是正确的。