数字输入的C ++输入验证

时间:2012-11-18 22:12:08

标签: c++ validation

我正在创建自己非常简单的程序,允许用户输入数值。目前代码工作正常,但我需要验证if else语句。这就是我现在所拥有的;

#include <iostream>
#include <string>

using namespace std;

int main()
{

    unsigned __int64 input = 0;
    char str[] = "qwertyuiopasdfghjklzxcvbnm[]{};'#:@~,./<>?|!£$%^&*()";

    cout << "Insert a number" << endl;
    cin >> input;

    if (input % 2 == 0) 
    {
        cout << "Even!" << endl;
    }
    else 
    {
        if (input% 2 == 1)
        {
            cout << "Odd" << endl;
            cout << "Lets make it even shall we? " << "Your new number is... " << input + 1 << endl;
        }
        else if (isdigit(str[0]))
        {
            cout << "That isn't a number!" << endl;
        }
    }

    system("pause");
    return 0;

}

我遇到的问题是,如果用户输入的不是数字,则返回的值为“偶数”。

我希望你们和女孩们可以提供帮助! 约翰

1 个答案:

答案 0 :(得分:4)

不要使用令牌提取(>>)进行主要解析。提取失败后,您的主要输入将处于未指定状态,这很糟糕。相反,逐行读取输入,然后处理每一行。

此外,从不忽略输入操作的结果。这只是一个平坦的错误。

所以,把所有这些放在一起,这就是你如何处理这个问题:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    for (std::string line; std::cout << "Input: " && std::getline(std::cin, line); )
    {
        std::cout << "We're parsing your line '" << line << "'\n";

        int n;
        std::istringstream iss(line);

        if (iss >> n >> std::ws && iss.get() == EOF)
        {
            std::cout << "It was a number: " << n << "\n";
        }
        else if (line.empty())
        {
            std::cout << "You didn't say anything!\n";
        }
        else
        {
            std::cout << "We could not parse '" << line << "' as a number.\n";
        }
    }

    std::cout << "Goodbye!\n";
}

请注意,所有输入操作(即>>getline)都出现在直接布尔上下文中!