我正在模拟一个计算器,想知道我该如何只接受正输入而没有其他字符(负整数,字母等)
我尝试使用2个do while循环,一个验证正整数和另一个验证字符,但似乎无法为1个输入进行2个循环,否则,看起来会很奇怪...
do{
if (invalid == true)
{
cout << "Invalid input, please enter a positive number" << endl;
}
cout << "Please enter the first number:" << endl;
cin >> num1;
cin.ignore();
invalid = true;
} while (num1 < 0);
invalid = false;
使用上面的代码,它仅将输入验证为正整数,但是一旦我输入了字母(如字母),程序就会崩溃。有什么办法可以同时排除两者?
答案 0 :(得分:1)
我的建议是将整行读取为字符串(使用std::getline
),然后尝试将字符串解析为无符号整数。
可以实现类似
unsigned value;
for (;;)
{
std::string input;
if (!std::getline(std::cin, input))
{
// Error reading input, possibly end-of-file
// This is usually considered a fatal error
exit(EXIT_FAILURE);
}
// Now parse the string into an unsigned integer
if (std::istringstream(input) >> value)
{
// All went okay, we now have an unsigned integer in the variable value
break; // Break out of the loop
}
// Could not parse the input
// TODO: Print error message and ask for input again
// Loop continues, reading input again...
}
可以将其放入函数中进行泛化,因此可以将其重用于获取多个值。您甚至可以将函数设为模板,以便可以将其用于不同的输入类型(有符号或无符号整数,浮点数,甚至具有合适的输入运算符>>
重载的对象)。
答案 1 :(得分:0)
检查std::cin >>
的结果,并在发生错误时清除错误,然后读一个单词(如果愿意,还可以阅读所有行),不要忘记处理EOF情况。
例如
#include <iostream>
#include <string>
int main()
{
int n;
for (;;) {
if (!(std::cin >> n)) {
// remove bad 'word'
std::cin.clear();
std::string s;
if (!(std::cin >> s)) {
std::cerr << "EOF" << std::endl;
return -1;
}
std::cerr << "not a number" << std::endl;
}
else if (n < 0)
std::cerr << "negative value" << std::endl;
else
break;
}
std::cout << "positive value " << n << std::endl;
return 0;
}
编译和执行:
pi@raspberrypi:~ $ g++ -pedantic -Wall -Wextra i.cc
pi@raspberrypi:~ $ ./a.out
aze
not a number
-1
negative value
2
positive value 2
pi@raspberrypi:~ $
pi@raspberrypi:~ $ echo | ./a.out
EOF
pi@raspberrypi:~ $ ./a.out
aze -1 23
not a number
negative value
positive value 23