什么是使用'\ r'转义序列?

时间:2011-09-10 16:08:42

标签: c++ c escaping carriage-return

我有这样的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

8 个答案:

答案 0 :(得分:79)

\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;
}

它会在同一位置重复打印字符- \ | /,以便在终端中显示旋转|的错觉。

答案 1 :(得分:22)

程序正在打印"Hey this is my first hello world ",然后它将光标移回到行的开头。屏幕上的显示效果取决于您的环境。看起来字符串的开头被某些东西覆盖,也许是你的命令行提示符。

答案 2 :(得分:6)

\r将光标移动到行的开头。

在不同系统上以不同方式管理换行符。有些只使用\n(换行,例如Unix),有些使用(\r,例如Mac OS之前的MacOS),有些使用\r\n(例如Windows afaik)。

答案 3 :(得分:6)

'\ r'代表“回车” - 它是打字机和旧打印机时代的延续。最好的例子是Windows和其他DOSsy操作系统,其中换行符为“\ r \ n”。这些是发送到旧打印机以开始新行的说明:首先将打印头移回到开头,然后向下移动。

不同的操作系统将使用其他换行序列。 Linux和OSX只使用'\ n'。较旧的Mac操作系统只使用'\ r'。 Wikipedia有一个更完整的列表,但这些是重要的列表。

希望这有帮助!

PS:至于为什么你得到那个奇怪的输出......也许控制台正在将“光标”移回到行的开头,然后用空格或summat覆盖第一位。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

这是来自陈旧的技术:旧时尚打字机的打印机风格。有一个滚筒(压板)使纸张前进,打印头将金属钥匙钉在墨水织物上。

\ r \ n将打印头放回左侧。

\ n推进压板一行。

如果没有发出\ n,你可以输入一行上的内容(主要用于下划线文本)。

答案 6 :(得分:2)

要回答你的部分问题,

  

\r的用途是什么?

许多Internet协议(如FTP,HTTP和SMTP)都是根据回车符和换行符分隔的行指定的。因此,例如,在发送电子邮件时,您可能会有以下代码:

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

或者,当FTP服务器回复具有权限被拒绝的错误时:

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

答案 7 :(得分:1)

当您在unix平台上运行时,它非常有用,需要创建一个文本文件 这将在dos平台上打开。

Unix使用'\ n'作为行终止符,dos使用'\ r \ n'作为行终止符,因此您可以使用它来创建dos文本文件。