我一直在做一些简单的程序,例如猜数字游戏,下注游戏等。我试图在这些程序中做的一件事是创建一个用于输入错误数据类型的陷阱。因此,如果我有变量int num;
并且用户输入了字符串,是否可以识别输入的数据是否与声明的变量的数据类型不匹配并要求重新输入?
谢谢。
最佳答案
C ++ IOstream库为您做到了。默认情况下,如果std::istream
操作失败,则formatted extraction对象将失败。
所以当你有这样的事情。
int num;
if(!(std::cin >> num)){
//operation failed
}
如果用户输入数字以外的字符。
std::cin
将失败。因此,您要做的就是检查stream
对象的状态,以了解格式化输入是否成功有没有办法识别输入的数据是否与
数据类型为已声明的变量,并要求重新输入吗?
您可以执行以下操作:
#include <limits> //for std::numeric_limits
#include <ios> //for std::streamsize
......
int num;
while(!(std::cin >> num)){
std::cerr << "Please enter a valid number!\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
编辑:
正如user4581301在comment中指出的那样,需要注意一些极端的情况。
ints/floats
hullabalo的一个稍微改进的技巧可能是:while(!(std::cin >> num) || std::cin.get() == static_cast<int>('.') ){
std::cerr << "Please enter a valid number!\n";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
请注意,此hack仅适用于
ints
关于c++ - 如何为数据类型创建捕获,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40273698/