检查输入是否为整数

Check if input is integer

为了学习C++,我正在翻译我在Python写的一个程序。

这是我写的

n = 0
while n < 2:
    try:
        n = int(raw_input('Please insert an integer bigger than 1: '))
    except ValueError:
        print 'ERROR!'

为了从用户那里得到一个大于1的整数。

这是我暂时用C++写的:

int n = 0;
while (n < 2) {
    cout << "Please insert an integer bigger than 1: ";
    cin >> n;
}

我看了一下 try-catch,它看起来很简单。我关心的是如何检查输入是一个整数。我阅读了有关 cin.fail() 的内容,但我找不到任何官方文档,也没有真正了解它是如何工作的。

那么,如何检查输入是否为整数?

更一般地说,我如何检查输入是否为“anything”?

对于这种情况,您可能希望将输入作为字符串读取,然后检查该字符串(例如,"contains only digits, up to a maximum of N digits")。当且仅当它通过检查时,从中解析出一个 int

也可以将检查和转换结合起来——例如,Boost lexical_cast<int>(your_string) 将尝试从字符串中解析出一个 int,如果不能将整个字符串转换为一个整数。

如果您使用 C++11 的 std::stoi 结合 std::getline 读取整行输入,您的 Python 可以更直接地翻译代码。这比使用标准 I/O 错误处理要容易得多,后者可能没有非常用户友好的界面。

std::stoi 如果无法将输入正确解析为整数,则抛出 std::invalid_argument,如果数字太小或太大而无法放入 [=],则抛出 std::out_of_range 17=].

#include <iostream>
#include <string>

int main() {
    int n = 0;
    while (n < 2) {
        std::cout << "Please insert an integer bigger than 1: ";
        std::string input;
        std::getline(std::cin, input);
        try {
            n = std::stoi(input);
        } catch (std::exception const&) {
            std::cerr << "ERROR!\n";
        }
    }
}

如果你想让代码更类似于它的 Python 等价物,那么你可以将输入封装在一个函数中:

#include <iostream>
#include <string>

int raw_input(std::string const& message)
{
    std::cout << message;
    std::string input;
    std::getline(std::cin, input);
    return std::stoi(input);
}

int main() {
    int n = 0;
    while (n < 2) {
        try {
            n = raw_input("Please insert an integer bigger than 1: ");
        } catch (std::exception const&) {
            std::cout << "ERROR!\n";
        }
    }
}