【问题标题】:Line spacing after endl and cout?endl 和 cout 之后的行距?
【发布时间】:2013-03-03 17:40:54
【问题描述】:

我注意到在以下代码中:

    cout << "Please enter your number: ";
    cin >> Number;
    cout << "Is this spaced";

C++ 命令窗口中的输出会自动将“Is this spaced”放在下一行。它将cin 行之后的任何内容都隔开,而无需使用流操纵器(为什么这称为流操纵器?)endl。而如果我只有代码:

    cout << "Please enter your number: ";
    cout << "Is this spaced";

它不会自动用“Is this spaced”分隔行。相反,两条线都连接在一起。我很想知道为什么会这样,因为我一直认为您需要endl 才能创建新的空间行。

谢谢!

【问题讨论】:

  • 因为你按下了回车...添加了换行符。

标签: c++ line cout spacing endl


【解决方案1】:
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";

这不仅仅是表面上看到的。 std::coutstd::cin 是 - 默认情况下 - tied 流。这意味着只要std::cin 被要求输入,std::cout 就会自动刷新(即,任何挂起的输出从程序内的任何缓冲区刷新到操作系统)。这就是为什么您可以确保在程序暂停等待您输入之前看到"Please enter your number: "。当然,在大多数操作系统中,您可以在程序等待之前开始输入 - 它会将其回显到终端并记住它稍后提供给std::cin:这也是当您使用管道调用程序时发生的情况,例如:

echo "123" | the_program

输入在the_program 开始运行时可用,但会坐在那里等待cin &gt;&gt; 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(a换行符),然后一次向操作系统发送“hello world\n”。这种程序内存储和数据连接称为缓冲,将数据从缓冲区写入操作系统的行为称为刷新。

【讨论】:

  • 您能解释一下“flushed”和“echo”是什么意思吗?我是相当新的编程术语:P.
  • @JustinLiang:我在答案中添加了“冲洗”的描述。 echo "xyz" 只是 Linux/UNIX shell 和 Windows 命令窗口中用于打印一些文本的命令……它实际上是在要求 shell 在内部执行 std::cout &lt;&lt; 'xyz\n";
【解决方案2】:

默认情况下,cin 在收到newline 时结束读取流,newline 也会添加新行。

【讨论】:

    【解决方案3】:

    当你在终端上使用cin (std::cin) 时,你经常需要按回车键告诉终端“嘿,我的输入完成了。”

    Enter 也被翻译为换行符,因此它会粘贴本质上是 std::endl 的内容,因为您按下了 Enter

    在许多情况下,您可以使用退格符\b 来回溯控制台的当前写入。你可以试试std::cout &lt;&lt; '\b':它碰巧在我的终端(Windows)中回溯。

    【讨论】:

    • 如果我不希望它在按下Enter 时跳到下一行,我该怎么办?
    • 通常情况下,不可能摆脱那个换行符。正如我所说,您最好的选择是插入 \b 退格字符并希望它回溯您输入的输入。如果没有,那么您无能为力:控制台输出相当固定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2017-05-13
    相关资源
    最近更新 更多