整数的输入验证

时间:2016-06-25 12:46:57

标签: c++ validation

我遇到一些基本的输入验证问题。我做了很多搜索,但似乎无法找到适用于我的代码的答案。我试图验证整数输入。我能够测试是否输入了一个字符,但我需要另一个参数来测试该数字实际上是否为int而不是double或float。

do
{
    cout << "\nHow many numbers would you like to enter?" << endl;
    cin >> size;

    if (size < 1 || cin.fail())
    {
        cout << "\nInvalid input" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    }
}while(size < 1 || cin.fail());

2 个答案:

答案 0 :(得分:0)

太迟了。当operator>>完成它的工作时,马已经离开了谷仓。在实际解析值之前,你必须弄明白。

如果您告诉operator>>将值提取为整数,operator>>将首先跳过任何空格,解析可选的负号,然后解析它看到的数字。这就是你将得到的。

如果最后一位数后跟一个“。”,则operator>>无关紧要。它会停止,因为你告诉它解析一个整数,然后把它称为一天。

同样,如果您告诉operator>>将值提取到其中一个浮点类型(floatdoublelong double),operator>>将解析任何看起来像浮点数的东西,并将其放入浮点类型实例中。由于整数看起来像一个完全有效的浮点数,因此整数或浮点数将平均解析并存储。

除了值本身之外,您没有指示实际解析的内容。

所以,有两种方法可以做到这一点。一种方法是始终将值解析为浮点数,然后检查解析的数字是整数,还是包含任何小数部分,然后相应地进行。

或者,你可以自己解析一下。使用get()一次解析一个字符。忽略任何前导空格,然后收集下面的所有内容:可选的减号,零个或多个数字,一个可选的句点后跟零个或多个数字,以及一个可选的“e”后跟一个指数。

如果你收集了句号或“e”,作为这个过程的一部分,你知道你刚刚解析了一个浮点数,否则它将是一个整数。然后,收集所有已收集的内容,然后在std::istringstream的帮助下将其解析为您选择的值。

(从技术上讲,“e”并不一定表示浮点值;例如1e3将很乐意生活在int内,由您决定如何处理此案例。

答案 1 :(得分:0)

我认为您可以先阅读输入,然后再进行验证。 如果您可以使用c11编译器并且应用程序只需要正数并且不关心符号,例如“+”,“ - ”,您可以尝试类似下面的代码:

#include <regex>
... 
std::regex integers(R"(\d+)");
enum{INPUT_SIZE=256};
char input[INPUT_SIZE];
do
{
    memset(input, 0, INPUT_SIZE);
    cin >> input;
    if(std::regex_match(input, input+strlen(input), integers))
    {
        cout << input << " is an integer\n";
    }
    else
    {
        cout << "input is not an integer";
    }
}while(1);