为什么 getline(...) 打印在屏幕上?

Why does getline(...) print on screen?

我正在尝试(在 C++ 中)从键盘获取一些输入,我想存储这些输入供以后使用。这只是我正在处理的代码的简化版本,但它重现了相同的行为:

#include <iostream>

int main(int argc, char * * argv)
{
    std::string line;

    std::cout << "> ";
    std::getline(std::cin, line);

    return 0;
}

getline 正确地从 stdin 读取输入,但输入后立即在新行上打印。另外, > 字符后的白色 space 在读取我的输入时被忽略,但之后打印出来。类似于:

>hi
> hi

为什么会这样?我怎样才能避免它?

我在 Windows 10,使用 CLion 2016.1(这发生在 CLion 的控制台上)。

Why does this happen?

可能是因为输出缓冲。

How can I avoid it?

通过使用 std::cout << "> " << std::flush; 而不是 std::cout << "> "; 在调用 getline() 之前打印应该打印的内容。

如果在内置控制台中 运行 Clion 会这样做,但是如果在 windows 控制台中 运行 它不应该发生。

How can I avoid it?

完成此操作的最简单方法是 运行 它处于调试模式。

为什么不用std::cin?奇怪的行为可能是因为你的平台。

您有一个 std::cout 后跟 getline() 函数。 getline 中的某些行为可能会根据您使用的编译器的不同而略有不同。有些人可能无法重现您的行为。

本质上,在传统的 C++ 键盘样式中 I/O 大多数人在大多数输入或输出后调用 std::endlendl 在其中自动调用 flush() 以刷新标准缓冲区。但是,getline() 函数是 C 语言的遗留物。在 C 语言中,经常需要重复使用 flush() 命令来获得所需的输出。这就是为什么最好尽可能坚持 C 风格输出或 C++ 风格输出的原因之一。

为什么不能使用 std::cin?你可以用 endl 跟进,之后一切都应该表现良好。

或者,您可以只调用一个裸体 endl 或一个 flush() 来让事情回到定义的行为领域。

你有什么理由特别需要 getline() 吗?