我正在尝试创建一个接受 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

我也感到很奇怪,当我将ndouble更改为int时,会找到所有字符(Input = becausestr输出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/

10-10 08:22