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

我写了这个

1
2
3
4
5
6n = 0
while n < 2:
try:
n = int(raw_input("Please insert an integer bigger than 1: "))
except ValueError:
print "ERROR!"
为了从用户获得大于1的整数。
这就是我目前用C ++编写的内容:
1
2
3
4
5int n = 0;
while (n < 2) {
cout <<"Please insert an integer bigger than 1:";
cin >> n;
}

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

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

更一般地说,我如何检查输入是否"任何"?

en.cppreference.com/w/cpp/io/basic_ios/fail

@LogicStuff,我读了它,我几乎什么都不懂(新手在这里)。 你能不能用外行的话来解释一下吗?

对于这种情况,您可能希望将输入作为字符串读取,然后检查字符串(例如,"仅包含数字,最多包含N位数字")。当且仅当它通过检查时,解析int。

也可以将检查和转换结合起来 - 例如,Boost lexical_cast(your_string)将尝试解析字符串中的int,如果无法将整个事物转换为int,则抛出异常。

为什么不std::basic_ios::operator bool?

@LogicStuff测试流状态仅适用于某些场景。如果我在int cin中输入15.30会很好,但流中仍会有.30。

@LogicStuff:正如Nathan暗示的那样,流状态告诉您输入数据是否以至少一个可以转换为正确类型的字符开头。在这种情况下,它听起来(至少对我而言)就像他想要检查所有输入都可以转换。

@JerryCoffin:lexical_cast安装在哪里?我在packages.ubuntu.com/中搜索,但是当我尝试安装libboost1.46-dev和libboost1.48时,我得到了:E: Package libboost1.46(和48)-dev has no installation candidate

@Pigna:stackoverflow.com/q/12578499/179910

@JerryCoffin哦是的,但我想避免安装整个包装

如果使用C ++ 11的std::stoi与std::getline组合来读取整行输入,那么Python可以更直接地编译代码。这比挣扎于标准I / O错误处理容易得多,标准I / O错误处理可能没有非常用户友好的界面。

如果输入无法正确解析为整数,则std::stoi抛出std::invalid_argument;如果数字太小或太大而无法放入int,则std::out_of_range。


#include 
#include 
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!
";
}
}
}

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


#include 
#include 
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!
";
}
}
}

我有两个问题:1。当我运行你的代码时,我得到error: "stoi’ is not a member of "std’,2。我没有在raw_input和const&里面得到const& message的含义。你能解释一下吗?

@Pigna:我猜你的编译器太旧了。获得升级以获得C ++ 11支持。 const&表示"const引用"。通常传递这样的不可修改的字符串以避免不必要的副本。但是,这些东西是在C ++入门书籍中处理的。如果你认真对待这门语言,你需要学习一本书。

我不需要升级g ++,我只需要添加--std=c++11。我很认真,我刚刚开始学习learncpp.com。但是在完成课程之前我更喜欢弄脏手。

另一个问题@ChristianHackl:使用这些方法,如果我输入一个浮点数就不会抛出错误。如何解决这个问题?

@Pigna:std::stoi非常宽松,如果在已经解析了正确的整数(例如"123xxx"或"123.001")之后还有其他字符,则默认情况下不会报错。为了解释这些情况,std::stoi有第二个参数,它告诉您解析了多少字符以获得结果。如果此数字不等于输入字符串的大小,则表示字符串中存在其他字符。 size_t pos; int result = std::stoi(input, &pos); bool error = (pos != input.size());