C 语言中 "\r" 的作用是什么?

2024年8月28日 | 阅读 4 分钟

C 编程语言中的 **"\r" 字符** 被称为 **“回车符” (Carriage Return)**,它有助于将光标移动到当前行的开头,而不会前进或跳到下一行。

在某些情况下,您可能希望 **添加其他文本** 而不向控制台或终端窗口的当前行引入新行。在某些情况下,您可以通过使用 **"\r" 字符** 将光标移回行首,来在现有内容之上编写新文本。

示例代码片段

输出

Loading: 0
Loading: 1
Loading: 2
Loading: 3
Loading: 4
Loading: 5
Loading: 6
Loading: 7
Loading: 8
Loading: 9

说明

此程序从 **0 计数到 9**,但它不会在循环的每次迭代后产生新行,而是覆盖之前的输出。为了使循环的下一次迭代能够从控制台窗口的左侧开始替换之前的输出,**"\r"** 字符会将光标移回行首。

注意:`fflush(stdout)` 调用会刷新输出缓冲区,导致输出立即打印到控制台。如果没有此调用,如果输出被推迟到程序结束,使用 "\r" 实时更新输出的目标就会落空。

关于 C 编程中 **"\r"** 的其他一些附加信息如下:

  • 在 C 语言中,**"\r"** 被表示为一个字符字面量。它与其他计算机语言中的 **回车符** 具有相同的 **ASCII 码**,即 **13**,这使得它易于识别。
  • 通过将 **"\r"** 字符与 **"\n" (换行符)** 和 **"\t" (制表符)** 等其他控制字符结合使用,可以创建复杂的输出格式。
  • 为了确保在 **"\r"** 更新控制台或终端窗口上的输出后,输出能快速提供到控制台,使用 **fflush(stdout)** 刷新输出缓冲区至关重要。否则,之前的输出可能会被缓存到输出缓冲区中,导致显示延迟。
  • **"\r"** 命令有时可用于在控制台输出动画或动态文本。例如,您可以使用 **"\r"** 构建一个在长时间任务完成时更新的进度条。
  • 在 C 语言中创建自定义控制台输出时,**"\r"** 经常与 **puts()** 和 **printf()** 等其他控制台输出函数结合使用,以控制输出格式。
  • 在 **命令行界面 (CLIs)** 和其他基于文本的程序中,**"\r"** 更新符号经常用于显示操作的状态,例如 **下载文件、传输数据** 或 **编译代码**。
  • **"\r"** 对于在不滚动整个终端窗口的情况下更新单行输出特别有用。这对于处理大型数据集或冗长过程非常有利。
  • 除了 **"\r"** 之外,C 语言中的其他特殊字符,如 **"\b" (退格符)、"\v" (垂直制表符)** 和 **"\r" (回车符)**,也可用于修改输出格式。这些附加的特殊字符分别将光标向后移动一个字符和向下移动一行。
  • 除了在 C 编程中使用外,**"\r"** 也可用于控制 **Java**、**Python** 和 **Ruby** 中的控制台输出。
  • 当使用 **"\r"** 刷新控制台输出时,确保新输出与先前输出的长度相同或更长至关重要。如果新输出比旧输出短,未被覆盖的旧输出字符可能会导致输出失真或不准确。
  • **"\r"** 不会清除行或删除任何文本,它只会将光标移到当前行的开头。如果您想在编写新输出之前格式化行,请使用 **"\r"** 和其他控制字符,如 **空格或退格符**,用空格替换旧文本。
  • 与 **scanf()** 和 **gets()** 等其他终端输出函数结合使用时,**"\r"** 可用于修改输入和输出格式。例如,使用 **"\r"** 创建一个随着用户输入而变化的命令行提示符。

示例

另一个演示 C 语言中 **"\r"** 用途的代码片段,用于创建动画加载指示器

输出

Loading \
Loading -
Loading +
Loading {
Loading \
Loading -
Loading +
Loading {
Loading \
Loading -
Done!!!!!!