如何解决这个怪异的while循环错误?

时间:2020-10-30 20:39:33

标签: c++ while-loop

我有一个while循环,它询问用户的查询并接受响应,可以是单词,也可以是句子。输出让我感到困惑。

std::string response;

while (response != "!quit")
    {
        cout << "Query? ";
        cin >> response;
        if (response == "!quit")
        {
            cout << "Thank you for using this program!";
            exit(0);
        }
    }

此输出如下:

Query? how are you
Query? Query? Query? how are you today
Query? Query? Query? Query? hi
Query?

为什么打印出“查询”字样的字数与响应相同?

2 个答案:

答案 0 :(得分:5)

EC.presence_of_element_located将会读取直到发现空白为止。

因此,当您输入“您好吗”时,std::cin将被称为三次,这样它将占用所有三个空格。因此,第一个cin将显示“如何”,第二个是“是”,第三个是“您”。

因此,教给您的是,要阅读一个句子,您需要另一种方法,例如通过使用std::getline,如下所示:

cin

What's the difference between getline and std::istream::operator>>()?中阅读更多内容


PS:请注意,您可能想使用std::getline(std::cin, response) 读取数字后可能会出现尾随换行符,例如通过使用cin

答案 1 :(得分:3)

可以是一个单词,也可以是一个句子。

当您想读一个单词时,可以使用cin >> response;。这将在找到的下一个空白字符处停止读取。

要阅读句子(整行)时,需要使用getline(cin, response);。这将在找到的下一个新行\n字符处停止读取。

因此,由于您希望在一行上输入一个输入,因此请使用第二个功能。

编辑:另外,请注意!在非字符串I / O操作之后使用getline()(例如cin >> n;,其中nint变量)时,您需要知道非字符串I / O。 / O函数不会“吃掉” \n字符。 getline()会找到它,将其食用并停止,因此最好通过空的cin.getline();通话自己食用。