![](/img/trans.png)
[英]after delete endl in cout << “hello” << endl, my C++ program stopped working
[英]Line spacing after endl and cout?
我在以下代码中注意到了这一点:
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
C ++的命令窗口中的输出会自动在下一行添加“是否已隔开”。 它在cin
行之后cin
任何内容,而无需使用流操纵器(为什么将其称为流操纵器?) endl
。 而如果我只有代码:
cout << "Please enter your number: ";
cout << "Is this spaced";
它不会自动用“此间距”分隔行。 而是将两条线连接起来。 我很想知道为什么会这样,因为我一直认为您需要endl
才能创建新的空间行。
谢谢!
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
这不仅是吸引眼球的事情。 std::cout
和std::cin
是默认情况下的绑定流。 这意味着,每当要求输入std::cin
时,都会自动刷新std::cout
(即,将任何未完成的输出从程序内的任何缓冲区刷新到操作系统)。 因此,您可以在程序暂停等待键入之前确保看到"Please enter your number: "
。 当然,在大多数操作系统中,您可以在程序等待之前开始键入-它会回显到终端,并记住它稍后提供给std::cin
:当您使用以下管道调用程序时,也会发生这种情况:
echo "123" | the_program
当the_program
开始运行时,输入可用,但在the_program
输入cin >> Number;
尝试解析。 不过,在这种情况下,没有键盘输入供终端程序回显,因此在两行输出之间的屏幕上未回显“ 123 \\ n”序列-没有换行符“ \\ n”,您的输出将全部出现在一行上。
如果您想在键盘输入没有光标移动到下一行的情况下进行读取,最好使用ncurses或类似的库。 这些库可以使用适合您终端的转义序列(如果有)来将光标重新定位到您喜欢的位置。 如果您要支持的终端范围非常有限(例如,仅与xterm兼容的终端,VT220或Windows命令外壳),则自行编写代码可能是实用的。 通常也可以禁止打印键盘输入,但是这样用户看不到自己在键入数字。 另一个选择是将终端设置为支持逐字符输入读取的输入模式(某些终端默认为逐行,因此直到按下回车键才能看到字符)-将其与抑制的回声结合起来程序可以在键入时打印数字,但不能打印换行符。
另外,最好用换行符结束程序的输出,因为某些调用环境否则不会显示最后一行。 而且,这有点争议,但是恕我直言,最佳实践是在不需要刷新输出时不使用std::endl
使用\\n
并让C ++ iostream库缓冲多行并将它们以有效大小的块写入操作中系统。
假设您有一个这样的程序:
std::string h = "hello ";
std::string w = "world";
std::cout << h;
std::cout << w << '\n';
在某个阶段,程序需要告知操作系统(Linux,Windows等)有关要打印的文本,让其将其发送到shell / cmd提示符(这可能会将其发送到屏幕上并将其放入缓冲区中)用于滚动条等),文件或其他内容。 在大型方案中,程序告诉操作系统执行此类操作的速度很慢,因此,如果记住“ hello”,添加“ world”和\\n
(换行符, ),然后立即将“ hello world \\ n”发送到操作系统。 程序内的数据存储和连接称为缓冲,将数据从缓冲区写入操作系统的行为称为刷新。
缺省情况下, cin
收到newline
也会结束读取流, newline
还会添加newline
。
当在终端上使用cin
( std::cin
)时,通常必须按Enter才能告诉终端“嘿,我的输入完成了”。
Enter也被翻译为换行符,因此保留了本质上是std::endl
因为您按了Enter
。
在许多情况下,可以使用退格字符\\b
来回退控制台的当前书写。 尝试std::cout << '\\b'
可能对您std::cout << '\\b'
:它在我的终端机(Windows)中回溯了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.