所以我想知道如果我有以下代码会发生什么
int i;
cin>> i;
但实际上我输入了"abc"
而不是整数。它失败?有哪些方法可以确保从命令行读取不会失败?
答案 0 :(得分:2)
将设置流的失败位,并且在该位清零之前,进一步的操作将不执行任何操作。您可以阅读有关流位here的更多信息。
如果您不希望它失败,只需检查位:
int i;
std::cin >> i;
if (!std::cin)
{
// didn't read correctly, handle it
}
或者一举一动:
int i;
if (!(std::cin >> i))
{
// didn't read correctly, handle it
}
可能有更强大的收集输入方式,但您想要的取决于您的情况。
答案 1 :(得分:1)
几乎按定义,您无法确保从命令中读取 线不会失败。要做到这一点,你必须控制正在发生的事情 键入键盘(或在文件中或输入的任何内容) 重定向自)。您必须为该输入中的错误做好准备。如果 你需要一个int,并且用户输入“abc”,你需要输入 失败,以便您可以检测错误并恢复。
在输入流中,一旦检测到错误,您必须重置
它(std::cin.clear()
),然后以某种方式重新同步:“abc”是
仍然在流中,并将成为您阅读的下一件事 - 取决于
应用程序,istream::ignore
可以使用,但一个常用的习惯用法
用于处理控制台输入是逐行读取,然后解析该行
使用std :: istringstream,boost :: regex或任何其他的组合
你恰好有用的工具。如果该行应该只包含
一个int,这是矫枉过正:std::cin.ignore( INT_MAX, '\n' )
应该很好地做到这一点,但对于具有多个字段的行,该行
按行方法可能更可取;它也有优势
区分由于语法错误导致的文件结束而导致的失败
自动。 (getline
std::cin
的失败是文件的结尾;
读取istringstream时失败通常是语法错误。)