【问题标题】:Why and how does the following outputs involving the carriage return show up?为什么以及如何显示以下涉及回车的输出?
【发布时间】:2013-12-09 20:42:09
【问题描述】:
#include <stdio.h>

void main()
{
    printf("ab");
    printf("\bsi");
    printf("\rha");
}

这段代码在 GCC 4.8 编译器上给出了“ha”的输出

#include <stdio.h>

void main()
{
    printf("ab");
    printf("\bsi");
    printf("\rha");
    printf("\n");
}

这段代码在 GCC 4.8 编译器上给出了“hai”的输出

现在的问题是为什么在添加语句 printf("\n"); 时输出会从“ha”变为“hai”。最后,由于前面的几行,(根据我)不应该影响代码。

【问题讨论】:

  • 如果你在 Ideone 中比较,输出没有区别:sample1sample2。这是特定终端/shell 实现的一种行为。
  • 好的,但我想知道它在 shell 中与 ideone 有何不同。

标签: c gcc output


【解决方案1】:

当你的程序结束时,shell 会从光标最后所在的任何位置开始写入提示。所以在第一种情况下,在\rha 之后,光标位于i 上。无论提示符的第一个字符是什么,shell 都会覆盖 i

在第二种情况下,您在末尾输出\n,这会将光标移动到下一行,shell 会在此处写入提示符。

【讨论】:

  • 我得到了第一个输出的原因,但是在 printf("\rha") 之后的第二个输出中会出现 "hai" 并且光标会在第二个字符的末尾准备写入第三个字符......然后 printf("\n") 将执行......所以应该删除第三个字符'i'并且光标移动到下一行(给出输出“ha”)或者字符'我'保持不变,光标移动到下一行((给出输出“hai”))??看到输出我猜是前者..
  • @sparx:是的,\n 移动到下一行而不改变当前行的任何内容。因此,如果当您输出\n 时光标位于i 上,i 将保持原位。
【解决方案2】:

首先你需要了解空格字符:

  1. \n :: 将光标移动到下一行。
  2. \b :: 将光标移回控制台左侧一个字符。只需简单地退格一 字符。
  3. \r :: Carrage Returns。它将光标移动到同一行的最右侧。

所以 printf 语句的结果是:: 1. 打印 "ab" ,光标位于行尾。 2. 将光标向后移动一个空格 (\b) 后打印“asi”,光标位于行尾。 3. 打印“hai”,光标位于 ha 之后,就在 i 下方。

所以,输出:: hai

在第一种情况下,由于光标,您无法看到“i”,而在第二种情况下,由于换行符,您可以看到它

【讨论】:

    【解决方案3】:

    如果你编译第一个代码,在 i 的地方,有光标,所以你看不到 i。在第二个代码中,光标在一个新行中,并且没有覆盖任何字符。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多