c ++-'\ r'转义序列的用途是什么?

我有这样的C代码:

#include
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个解决方案

83 votes

-是回车符; 它告诉您的终端仿真器将光标移动到行首。

光标是下一个字符将被渲染的位置。

因此,打印-可以覆盖终端仿真器的当前行。

Tom Zych弄清楚了为什么程序的输出是-而\在该行的末尾,并且此后您什么也不打印的原因:

程序退出时,外壳程序将显示命令提示符。 终端将其呈现在光标离开的位置。 您的程序将光标留在行的开头,因此命令提示符部分覆盖了您打印的行。 这解释了为什么您看到命令提示符后跟-的原因。

您提到的在线编译器仅将原始输出打印到浏览器。 浏览器将忽略控制字符,因此-不起作用。


这是-的用法示例:

#include 
#include 
int main()
{
char chars[] = {'-', '\\', '|', '/'};
unsigned int i;
for (i = 0; ; ++i) {
printf("%c\r", chars[i % sizeof(chars)]);
fflush(stdout);
usleep(200000);
}
return 0;
}

它将在同一位置重复打印字符- \ | /,从而给终端带来旋转|的错觉。

Arnaud Le Blanc answered 2020-01-04T01:50:28Z

23 votes

程序正在打印"Hey this is my first hello world ",然后将光标移回该行的开头。 这在屏幕上的外观取决于您的环境。 字符串的开头似乎被某些内容覆盖,也许是您的命令行提示符。

Tom Zych answered 2020-01-04T01:50:49Z

8 votes

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

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

希望这可以帮助!

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

Xavier Holt answered 2020-01-04T01:51:23Z

6 votes

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

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

Nornagest answered 2020-01-04T01:51:48Z

2 votes

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

wchargin answered 2020-01-04T01:52:08Z

2 votes

这来自于过时的技术:打印机的老式打字机样式。 有一个使纸张前进的滚筒(压纸卷轴)和一个将金属键锤击在墨水织物上的打印头。

\ r将打印头返回左侧。

\ n将压板前进一行。

如果未发出\ n,您将键入一行上的内容(主要用于下划线文本)。

Steve Wellens answered 2020-01-04T01:52:41Z

2 votes

要回答您的问题部分,

\r有什么用?

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

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

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

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

Toby Speight answered 2020-01-04T01:53:15Z

1 votes

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

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

EvilTeach answered 2020-01-04T01:53:40Z