为什么 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::endl
。 endl
在其中自动调用 flush()
以刷新标准缓冲区。但是,getline()
函数是 C 语言的遗留物。在 C 语言中,经常需要重复使用 flush()
命令来获得所需的输出。这就是为什么最好尽可能坚持 C 风格输出或 C++ 风格输出的原因之一。
为什么不能使用 std::cin
?你可以用 endl
跟进,之后一切都应该表现良好。
或者,您可以只调用一个裸体 endl
或一个 flush()
来让事情回到定义的行为领域。
你有什么理由特别需要 getline()
吗?
我正在尝试(在 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::endl
。 endl
在其中自动调用 flush()
以刷新标准缓冲区。但是,getline()
函数是 C 语言的遗留物。在 C 语言中,经常需要重复使用 flush()
命令来获得所需的输出。这就是为什么最好尽可能坚持 C 风格输出或 C++ 风格输出的原因之一。
为什么不能使用 std::cin
?你可以用 endl
跟进,之后一切都应该表现良好。
或者,您可以只调用一个裸体 endl
或一个 flush()
来让事情回到定义的行为领域。
你有什么理由特别需要 getline()
吗?