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

时间:2016-07-18 13:44:32

标签: c++ input cin getline clion

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

#include <iostream>

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

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

    return 0;
}

getline正确读取stdin的输入,但输入在新行之后立即打印。此外,在读取输入时忽略>字符后的空格,但在之后打印。类似的东西:

>hi
> hi

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

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

3 个答案:

答案 0 :(得分:2)

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

  

我该如何避免呢?

最简单的方法是在调试模式下运行它。

答案 1 :(得分:1)

  

为什么会这样?

可能是因为输出缓冲。

  

我该如何避免呢?

在使用getline()代替std::cout << "> " << std::flush;致电std::cout << "> ";之前,打印应打印的内容。

答案 2 :(得分:0)

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

您有std::cout后跟getline()功能。根据您使用的编译器,getline中的某些行为可能会稍微不同地定义。有些人可能无法重现您的行为。

基本上,在传统的C ++键盘输入/输出方式中,大多数人在大多数输入或输出后都使用std::endl调用。 endl内有flush()自动调用以刷新标准缓冲区。但是,getline()函数是C语言的延续。在C中,通常需要重复使用flush()命令来获取所需的输出。这就是为什么最好尽可能坚持C风格输出或C ++风格输出的原因之一。

为什么不能使用std::cin?您可以使用endl来跟进它,之后一切都应该很好。

或者,您可以通过调用裸endlflush()来解决问题,以便在定义的行为范围内恢复原状。

您是否有理由明确需要getline()