如何禁止包含非数字?

时间:2015-02-07 23:03:24

标签: c++ input

我有这个程序:

#include <iostream>
#include <string>

using namespace std;

int main()
{
int i=0;
float reader,  tot = 0;

while(i!=10)
{
    cout << "Insert a number: " << endl;
    cin >> reader;

    if(cin)
    {
        tot += reader;
        i++;
    }

    else
    {
        cout << "Error. Please retry." << endl;
        cin.clear();
    }
}

cout << "Media: " << tot/i << endl;

return 0;
}

在IF()中,我希望用户只在&#34;读者&#34;中插入FLOAT VALUES。变量。 我希望如果用户插入一个数字,程序会继续...否则程序应该重新要求用户插入正确的值。

如何检查INPUT?我尝试过TRY CATCH,但它没有用。

提前致谢!

3 个答案:

答案 0 :(得分:3)

  

“如何检查INPUT?”

已经确定了

cin >> reader;

用户只能输入有效的float值。检查有效性的方法是

if( cin >> reader ) {
   tot += reader;
   i++;
}
else {
   cout << "Error. Please retry." << endl;
   cin.clear();
   std::string dummy;
   cin >> dummy; // <<< Read invalid stuff up to next delimiter
}

这是fully working sample


  

“我试过TRY CATCH但是没有用。”

要从std::istream操作中获取例外,请设置std::istream::exceptions掩码。

答案 1 :(得分:2)

只需查看operator>>的结果:

if (cin >> reader) {
    // user gave you a float
    tot += reader;
    i++;
}
else {
    cout << "Error. Please retry." << endl;

    // clear the error flag on cin, and skip
    // to the next newline.
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

答案 2 :(得分:0)

您的原始程序很好,除非您在收到错误时需要跳过该错误输入。仅仅清除错误是不够的:

#include <iostream>
#include <string>
#include <limits> // include this!!!

using namespace std;

int main()
{
int i=0;
float reader, tot = 0.0f; // tot needs to be float

while(i!=10)
{
    cout << "Insert a number: " << endl;

    if( cin >> reader )
    {
        tot += reader;
        i++;
    }
    else
    {
        cout << "Error. Please retry." << endl;
        cin.clear();
        // Then you ned to skip past the bad input so you
        // don't keep tripping the same error
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

cout << "Media: " << tot/i << endl;

return 0;
}

函数cin.ignore()忽略尽可能多的输入字符,直到行尾字符'\n'为止。 std::numeric_limits<std::streamsize>::max()函数告诉我们可以存储在输入缓冲区中的最大可能字符数。

如果令人困惑的另一种方法是跳过错误的输入,只需将下一行读到std::string

    else
    {
        cout << "Error. Please retry." << endl;
        cin.clear();
        // Then you need to skip past the bad input so you
        // don't keep tripping the same error
        std::string skip;
        std::getline(cin, skip); // read the bad input into a string
    }