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

尝试验证整数,但是如果您输入此代码将无法正常工作,例如字符串'22a',它将try_no设置为22。是否有任何方法可以检查每个字符输入是否确实是字符串,例如'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
    }
}

最佳答案

可以说,最好的方法是将整个行作为字符串读取并利用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;
}

关于c++ - C++整数验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46891750/

10-10 21:36
查看更多