C ++整数验证

时间:2017-10-23 14:23:32

标签: c++ validation

目前在我的代码中创建整数验证循环时遇到问题。

尝试验证一个整数,但是如果你输入这个代码就无法工作,例如字符串'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
    }
}

1 个答案:

答案 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;
}