目前在我的代码中创建整数验证循环时遇到问题。
尝试验证一个整数,但是如果你输入这个代码就无法工作,例如字符串'22a'它将trial_no设置为22.有没有办法检查每个charachter输入确实是一个字符串,这样'22a'或'2a2'被认为是错误的,循环会持续到输入有效整数?
int trial_no;
bool valid = false;
while(!valid)
{
valid = true; //assume trial_no will be an integer
cout << "Enter the number of die throws to simulate" << endl;
cin >> trial_no;
if(cin.fail()) // exit loop condition is dependent on trail_no being a valid integer
{
cin.clear(); //corrects stream
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //skips left over stream data (numeric_limit
// is in case user enters more than one letter))
cout << "Please enter an integer value" << endl;
valid = false; //cin not an integer so loop goes round to try again
}
}
答案 0 :(得分:1)
可以说最好的方法是将整行读作字符串并使用std::stoi函数:
#include <iostream>
#include <string>
int main() {
std::cout << "Enter an integer: ";
std::string tempstr;
bool valid = false;
std::getline(std::cin, tempstr);
try {
int result = std::stoi(tempstr);
std::cout << "The result is: " << result;
valid = true;
}
catch (std::invalid_argument) {
std::cout << "Could not convert to integer.";
valid = false;
}
}
正如评论中指出的,此函数也可以抛出std::out_of_range异常。这假设您的编译器具有C ++ 11(+)功能。如果没有,请沿着std::stringstream路线前进:
std::string tempstr;
std::getline(std::cin, tempstr);
std::stringstream ss(tempstr);
int result;
bool valid = false;
if (ss >> result) {
valid = true;
}
else {
valid = false;
}