检查输入是否为整数 为了学习C++,我正在翻译一个用python编写的程序。

检查输入是否为整数 为了学习C++,我正在翻译一个用python编写的程序。,python,c++,cin,Python,C++,Cin,这是我写的 n = 0 while n < 2: try: n = int(raw_input('Please insert an integer bigger than 1: ')) except ValueError: print 'ERROR!' n=0 当n

这是我写的

n = 0
while n < 2:
    try:
        n = int(raw_input('Please insert an integer bigger than 1: '))
    except ValueError:
        print 'ERROR!'
n=0
当n<2时:
尝试:
n=int(原始输入('请插入大于1的整数:'))
除值错误外:
打印“错误!”
以便从用户处获取大于1的整数

这是我在C++中写的:

int n = 0;
while (n < 2) {
    cout << "Please insert an integer bigger than 1: ";
    cin >> n;
}
int n=0;
而(n<2){
cout>n;
}
我看了一下try-catch,它看起来很直截了当。我关心的是如何检查输入是否为整数。我读过关于cin.fail()的文章,但我找不到任何官方文件,也不知道它是如何工作的

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


更一般地说,如何检查输入是否为“任何内容”

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


还可以将检查和转换结合起来——例如,Boost
词法转换(您的字符串)
将尝试解析字符串中的int,如果不能将整行内容转换为int,则抛出异常。

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

std::stoi
如果无法将输入正确解析为整数,则抛出
std::invalid_参数
;如果该数字太小或太大,无法放入
int
中,则抛出
std::out_

#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";
        }
    }
}
#包括
#包括
int main(){
int n=0;
而(n<2){

std::cout Why not?@LogicStuff测试流状态只在某些情况下有效。如果我在
int
cin
中输入
15.30
会很好,但流中仍会有
.30
。@LogicStuff:正如Nathan所暗示的,流状态会告诉您输入数据是否以至少一个字符开头可以转换为正确的类型。在这种情况下,听起来(至少对我来说)他想检查所有输入是否可以转换。@JerryCoffin:lexical_cast安装在哪里?我搜索了,但当我试图安装libboost1.46-dev和libboost1.48时,我得到:
E:Package'libboost1.46
(和48)
-dev'没有安装候选者
@JerryCoffin哦,是的,但我想避免安装整个系统package@LogicStuff,我读了它,几乎什么都不懂(这里是新手)我有两个问题:1.当我运行你的代码时,我得到了
错误:'stoi'不是std'
的成员,2.我不明白
const&message
内部原始输入和
const&
内部捕获的含义。你能解释一下吗?@Pigna:我猜你的编译器太旧了。获取upgrade需要C++11支持。
const&
表示“const引用”这是很常见的,通过这样的不可修改的字符串来避免不必要的拷贝。但是,这些东西都是在介绍性的C++书籍中处理的。如果你对语言很认真,你需要学习一本书。我不需要升级G++,我只需要添加<代码>——STD= C++ 11 。我对此很认真,我刚刚开始学习学习CPP。但是我更喜欢在完成课程之前把手弄脏。另一个问题@ChristianHackl:使用这种方法,如果我输入一个浮点,它不会抛出错误。如何解决这个问题?@Pigna:
std::stoi
非常宽松,如果在解析正确的整数后有额外的字符,默认情况下不会报告错误d已经(例如
“123xxx”
“123.001”
)。为了说明这些情况,
std::stoi
还有第二个参数,告诉您解析了多少个字符以获得结果。如果此数字不等于输入字符串的大小,则您知道字符串中还有其他字符。
size\t pos;int result=std::stoi(input,&pos);bool error=(pos!=input.size());
#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";
        }
    }
}