gpt4 book ai didi

c++ - 为什么我使用getline时cout打印了两次?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:58 26 4
gpt4 key购买 nike

我正在尝试使用 getline 读取一串文本。出于某种原因,它会打印两次“请输入您的选择”:

Please enter your selection
Please enter your selection

如果我键入无效文本,它会再次循环,此后每次循环只打印一次。

while (valid == false) {    
cout << "Please enter your selection" << endl;
getline (cin,selection);

// I have a function here which checks if the string is valid and sets it to true
// if it is valid. This function works fine, so I have not included it here. The while
// look breaks correctly if the user enters valid input.
}

有人知道为什么会发生这种情况吗?

谢谢

最佳答案

可能当您进入循环时,输入缓冲区中仍有来自上一个操作的内容。

它被getline拾取,发现无效,然后循环再次运行。


举例来说,假设在进入循环之前,您读取了一个字符。但是,在 cooked 模式下,您需要输入字符 换行符才能执行。

因此,您读取了字符并且换行符留在了输入缓冲区中。

然后你的循环开始,读取换行符,并认为它无效,然后循环返回以获取你的实际输入行。

虽然这是一种可能性,当然,可能还有其他可能性 - 这在很大程度上取决于该循环之前的代码以及它对 cin 的作用。

如果这种情况,类似于:

cin.ignore(INT_MAX, '\n');

在循环可能修复它之前。

或者,您可能希望确保在任何地方都使用基于行的输入。


下面是一些代码,用于查看该场景的实际效果:

#include <iostream>
#include <climits>

int main(void) {
char c;
std::string s;

std::cout << "Prompt 1: ";
std::cin.get (c);
std::cout << "char [" << c << "]\n";
// std::cin.ignore (INT_MAX, '\n')

std::cout << "Prompt 2: ";
getline (std::cin, s);
std::cout << "str1 [" << s << "]\n";

std::cout << "Prompt 3: ";
getline (std::cin, s);
std::cout << "str2 [" << s << "]\n";

return 0;
}

连同成绩单:

Prompt 1: Hello
char [H]
Prompt 2: str1 [ello]
Prompt 3: from Pax
str2 [from Pax]

在其中您可以看到它实际上并没有等待提示 2 的新输入,它只是获取您在提示 1 中输入的行的其余部分,因为字符 e、< kbd>l、lo\n 仍在输入缓冲区中。

当您取消注释 ignore 行时,它会以您期望的方式运行:

Prompt 1: Hello
char [H]
Prompt 2: from Pax
str1 [from Pax]
Prompt 3: Goodbye
str2 [Goodbye]

关于c++ - 为什么我使用getline时cout打印了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11894215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com