检查输入是一个整数

时间:2013-02-21 09:49:59

标签: c++ int cin

我正在努力确保用户输入是一个正整数,无论​​用户试图放入什么,我的功能都能正常工作。

int getNumber()
{
    string userInput;
    int userNumber;
    bool badInput = true;
    cout<<"Enter a positive integer: ";
    cin>>userInput;
    while (badInput)
    {
        for (int i=0; i<userInput.length(); i++)
        {
            if (isdigit(userInput[i]))
            {
                badInput = false;
            }
            else
            {
                badInput = true;
                cout<<"That wasn't a valid input, try again: ";
                cin>>userInput;
                break;
            }
        }
    }
    userNumber = atoi(userInput.c_str());
    return userNumber;
}

有更清洁的方法吗?这是最好的方法吗?我尝试了各种其他方法,比如使用cin.bad等,但他们总是设法错过一些问题。

4 个答案:

答案 0 :(得分:1)

如果需要检查正整数,可能需要 将文本转换为整数。你应该两个都做 立刻;类似的东西:

std::string line;
if ( !std::getline( std::cin, line ) ) {
    //  no input available...
} else {
    std::istringstream parser( line );
    int userNumber;
    if ( parser >> userNumber >> std::ws
            && parser.get() == EOF
            && userNumber > 0 ) {
        //  All OK...
    } else {
        //  Some error in the input.
    }
}

如果你有字符串,也可以使用strtol 别处。错误检测有点棘手,因为strtol 在某些情况下有一些奇怪的语义:

int
getPositiveInteger( std::string const& input )
{
    char const* end;
    errno = 0;
    long results = strtol( input.c_str(), &end, 10 );
    if ( end != input.c_str() ) {
        while ( isspace( static_cast<unsigned char>( *end) ) ) {
            ++ end;
        }
    }
    return (errno == 0
            && end != input.c_str()
            && *end == '\0'
            && results > 0
            && results <= INT_MAX)
        ? results
        : -1;
}

(如果发生错误,我已经返回-1。)

您会注意到您必须测试的条件数量 确保stdtol工作正常。

答案 1 :(得分:0)

你可以简单地使用strtol,如下所示:

char str[] = "+12345";
char* end;
long number = strtol(str, &end, 10);
if (number < 0) {
    printf("Number is negative!\n");
    // ...
}
if (*end) {
    printf("Junk found after number: '%s'\n", end);
    // ...
}

答案 2 :(得分:0)

您可以使用std::string::find_first_not_of()对数字进行测试,使用std::stoi进行溢出

std::string input;
bool badInput;
int i;

std::cout << "Enter a positive integer: ";
do {
    std::cin >> input;
    try {
        badInput = input.find_first_not_of("0123456789") != std::string::npos;
        if (!badInput)
            i = std::stoi(input);
    } catch (const std::invalid_argument&) {
        badInput = true;
    } catch (const std::out_of_range&) {
        badInput = true;
    }

    if (badInput)
        std::cout << "That wasn't a valid input, try again: ";
} while (badInput);

但这并不会检查前导+

答案 3 :(得分:0)

就像mvp所说,strol是要走的路。

bool string_to_int(char* s, int* val) {
   char* endptr;
   errno = 0; /* reset errno */
   int i = strtol(s, &endptr, 10);
   if (endptr == s) return false; /* conversion failed */
   if (*endptr) return false; /* unexpected characters behind the integer */
   if (errno) return false; /* out of range */
   *val = i;
   return true;
}