我有这样的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
?
答案 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文本文件。