我遇到一些基本的输入验证问题。我做了很多搜索,但似乎无法找到适用于我的代码的答案。我试图验证整数输入。我能够测试是否输入了一个字符,但我需要另一个参数来测试该数字实际上是否为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());
答案 0 :(得分:0)
太迟了。当operator>>
完成它的工作时,马已经离开了谷仓。在实际解析值之前,你必须弄明白。
如果您告诉operator>>
将值提取为整数,operator>>
将首先跳过任何空格,解析可选的负号,然后解析它看到的数字。这就是你将得到的。
如果最后一位数后跟一个“。”,则operator>>
无关紧要。它会停止,因为你告诉它解析一个整数,然后把它称为一天。
同样,如果您告诉operator>>
将值提取到其中一个浮点类型(float
,double
,long 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);