我正在尝试创建一个接受 double 数并将其放入 vector 的简单程序。如果该值不是 double 数,它将检查该值是否为Q并继续运行,除非它为“Q”。
这是代码:
string str = "";
while (str != "Q")
{
double n;
cin >> n;
if (cin.fail())
{
cin.clear();
cin >> str;
if (str != "Q")
cout << "'" << str << "'" << " is invalid input. Please try again!" << endl;
}
else
vec.push_back(n);
}
它似乎工作正常。但是,在尝试输出str时,某些字符(b,e,c,a等)将被跳过。例如,当我键入
because
时,str
输出use
。我也感到很奇怪,当我将
n
从double
更改为int
时,会找到所有字符(Input = because
和str
输出because
)。我有什么想念的吗?如果不是 double 输出,这不是检查输出的可接受方法吗?
谢谢!
最佳答案
当用户输入because
,并且您尝试使用cin >> n
将其读取为数字时,它将尝试这样做。它有时会失败,并消耗所有字符,直到解析错误(不包括)为止。仅在消耗了这些字符之后,它才会返回并将操作标记为失败(您可以使用cin.fail()
检查)。请注意,浮点数确实可以包含十六进制字符,因为它们可能以十六进制表示法*编码。
如果将输入解析为数字失败,则读取数字会消耗一些十六进制数字,这些数字是您要消耗的字符串的一部分。 (详细信息请参见问题下方的注释。)
一个简单的解决方案是首先尝试读取'q'
,并且只有在失败的情况下才读取数字,并且在失败的情况下也输入用户意外的内容。
您可以查看下一个字符而无需使用它(因此,在使用 'q'
不是cin.peek()
的情况下,它仍然可以用于解析数字。
例:
if (cin.peek() == 'q') {
// really consume it, for the case you want to use cin later on again
cin.get();
// quit
} else if (cin >> n) {
// process input n
} else {
// handle user error; you can still get the whole line from cin
}
*)然而,有两件事很奇怪,可能会在注释中讨论:首先,十六进制数字应以
0x
开头,因此它应在第一个非数字/非符号字符处失败。其次,为什么int
不能同时显示此行为?整数也可以是十六进制编码的afaik。关于c++ - “Because”到“use”; C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26264420/