“ r”转义序列的用途是什么?

我有这样的 C 代码:

#include<stdio.h>
int main()
{
printf("Hey this is my first hello world \r");
return 0;
}

我使用 \r转义序列作为实验。当我运行代码时,我得到的输出如下:

o world

为什么会这样,\r到底有什么用?

如果我在一个在线编译器中运行相同的代码,我会得到如下输出:

Hey this is my first hello world

为什么在线编译器产生不同的输出,忽略了 \r

224889 次浏览

\r是一个 回程马车字符,它告诉你的虚拟终端在行的开始移动光标。

光标是将要呈现下一个字符的位置。

因此,打印 \r可以覆盖当前的虚拟终端。

Tom Zych 解释了为什么程序的输出是 o world,而 \r在这行的末尾,在这之后你不需要打印任何东西:

当程序退出时,shell 将打印命令提示符。终端在您离开光标的地方显示它。程序将光标放在行的开头,因此命令提示符会部分覆盖您打印的行。这解释了为什么命令提示符后面跟着 o world

您提到的 在线编译程序只是将原始输出打印到浏览器。浏览器忽略控制字符,因此 \r没有效果。

参见 https://en.wikipedia.org/wiki/Carriage_return

下面是 \r的一个用法示例:

#include <stdio.h>
#include <unistd.h>


int main()
{
char chars[] = {'-', '\\', '|', '/'};
unsigned int i;


for (i = 0; ; ++i) {
printf("%c\r", chars[i % sizeof(chars)]);
fflush(stdout);
usleep(200000);
}


return 0;
}

它在同一位置重复打印字符 - \ | /,给人一种在终端旋转 |的错觉。

将光标移动到行首。

在不同的系统上,分线管理是不同的。有些只使用 \n(换行,例如 Unix) ,有些使用(\r,例如在 OS X afaik 之前使用 MacOS) ,有些使用 \r\n(例如 Windows afaik)。

程序打印 "Hey this is my first hello world ",然后将光标移回行首。这在屏幕上的显示效果取决于您的环境。似乎字符串的开头被什么东西覆盖了,可能是您的命令行提示符。

正如 amaud576875所说,\r转义序列表示回车,类似于按下 Enter 键。然而,我不确定你是如何得到“ o world”的; 你应该(而且我确实)得到“ my first hello world”,然后换一行。根据您使用的操作系统(我使用的是 Mac) ,您可能希望使用 \n而不是 \r

当您在 unix 平台上运行并且需要创建文本文件时,它非常有用 将在 dos 平台上开放。

Unix 使用’n’作为行结束符,dos 使用’r n’作为行结束符,因此您可以使用它来创建 dos 文本文件。

这是来自于古老的技术: 老式打字机风格的打印机。有一个滚筒(压板) ,推进的文件和打印头,锤金属键对墨水织物。

将打印头返回到左侧。

将压板推进一行。

如果没有发出 n,您将键入一行中的内容(主要用于为文本加下划线)。

“ r”代表“马车归还”——它是打字机和老式打印机时代的遗留物。最好的例子是在 Windows 和其他 DOSsy 操作系统中,其中一个换行符是“ r n”。这些是发送到旧打印机启动新行的指令: 首先将打印头移回到开始位置,然后向下移动一行。

不同的操作系统将使用其他换行序列。Linux 和 OSX 只是使用’n’。老的 Mac 操作系统只用 r。维基百科有一个更完整的列表,但这些都是重要的。

希望这个能帮上忙!

PS: 至于为什么会出现这种奇怪的输出... ... 也许是控制台将“光标”移回到行首,然后用空格或汇编覆盖第一个位。

回答你的问题,

\r有什么用?

许多 Internet 协议,例如 FTP、 HTTP 和 SMTP,都是按照回车和换行符分隔的行来指定的。因此,例如,当发送电子邮件时,您可能有以下代码:

fprintf(socket, "RCPT TO: %s\r\n", recipients);

或者,当 FTP 服务器回复一个权限拒绝错误时:

fprintf(client, "550 Permission denied\r\n");