用于将字符串放入整数的 CIN 失败标志

cin fail flag for putting strings into ints

本文关键字:CIN 失败 标志 整数 字符串 用于      更新时间:2023-10-16

我需要使用 cin 从用户那里读取 int,但如果输入字符串,则打印错误消息。我一直在尝试使用它使用 if 语句和 cin.fail() 如果只输入字符,效果很好。但是,如果用户输入类似 3sadi 的内容,它似乎读取 3 并将字符串的其余部分留在缓冲区中,这不会给我错误消息,因为未设置 cin.fail() 标志。如果字符串的第一个字符是 int,我怎样才能使错误消息仍然打印?

int i1;
cin >> i1;
if (cin.fail() == true) {
    cout << "error" << endl; 
}
else{
    cout << "success" << endl;
}

例如。 32应该(并且确实)打印成功

red应该(并且确实)打印错误

3x应该打印错误,但打印成功并将 x 留在缓冲区中

如何使3x给我错误消息?或者,我可以将其作为字符串读取并将其转换为 int 并根据它是否失败或成功打印出消息,但是您如何在程序中使用类型转换错误?

数值的格式化输入成功是有一个包含数字的前缀。流不会轻易允许您更改该行为(您可以使用专用std::num_get<char>方面更改该行为,但我不会将其归类为简单)。最简单的方法可能是检查下一个字符(如果有的话)是否恰好是一个空格(并且不要使用fail();你应该只使用布尔值的转换):

if (std::cin && (std::isspace(std::cin.peek()) || std::cin.eof())) {
    ...
}

另外,不要将条件中的布尔值与truefalse进行比较:这样做的结果不会变得更布尔。