【问题标题】:"carriage return" returns different ouput“回车”返回不同的输出
【发布时间】:2018-09-03 10:31:27
【问题描述】:

我试图理解回车(\r)。所以我写了下面的代码。如果我运行下面的代码,我得到的输出是“go”。

方法一:

#include <stdio.h>
int main()
{

        printf("chi\rca\rgo");
        return 0;
}

但如果我尝试使用“\n”,那么我会得到输出“goi”。

方法二:

#include <stdio.h>
int main()
{
        printf("chi\rca\rgo\n");
        return 0;
}

这是什么错误?
谁能帮帮我?

【问题讨论】:

  • linux 仅当您的问题涉及使用 Linux API 进行编程或 Linux 特定行为时才使用此标签,而不仅仅是因为您碰巧在 Linux 上运行代码。
  • 我的猜测是提示会覆盖第一个输出中的i
  • 这两个版本的输出可能还有一些其他的不同,请仔细观察。
  • 刷新输出(以确保它被打印)并在从main 函数返回之前添加一个小的延迟?如果你在程序退出前看到的输出是goi,而在你只看到go后跟提示符之后,那你就知道了。
  • CR 的行为取决于操作系统和应用程序。因为这会产生“特定于 Linux 的行为”,所以 linux 标签是合适的

标签: c linux


【解决方案1】:

在这两种情况下你都应该得到“goi”。你可以测试一下here

回车实际上就是这样 - 它返回回车,即返回到行首。

所以当你打印“chi\rca\rgo”时,输出会发生这种情况:

==============================
| 1. | print "chi"     | chi |
==============================
| 2. | carriage return | chi |
==============================
| 3. | print "ca"      | cai |
==============================
| 4. | carriage return | cai |
==============================
| 5. | print "go"      | goi |
==============================

在输出末尾添加\n 不会改变这种行为。然而,终端通常是行缓冲的,这意味着换行符的行为类似于刷新。可能您只在第一种情况下看到“go”,因为没有换行符,终端还没有打印该行的所有字符。

【讨论】:

  • 是的......好吧,应该是什么,不幸的是什么是不同的东西。行尾是跨操作系统的彻底失败。在旧 Mac 上,CR 又名 \r 被用作换行符。 Notepad++ 将其解释为新行,Windows Notepad 忽略它。写字板作为新行。
  • 好吧,OP 用 linux 标记了他们的问题,给出了系统的上下文以及如何解释 \r。不幸的是,该标签已被删除,即使它与您刚才给出的原因相关。
猜你喜欢
  • 1970-01-01
  • 2020-01-19
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多