c中“\ t”,“\ r”和“\ b”有什么影响?

问题描述 投票:0回答:3

我对以下代码有点困惑:

#include <stdio.h>
int main()
{
     printf("\nab");
     printf("\bsi");
     printf("\rha");
     return 0;
}

当我在Linux上执行程序时,它会打印出来

ha

但是当我在Xcode上执行它时,它会打印出来

absi
ha

我对“\ t”,“\ b”和“\ r \ n”有点困惑,我无法弄清楚程序是如何工作的。

c
3个回答
1
投票

\t指的是一个制表符,\r指回车(想到打字机),\b指的是非破坏性的退格。正如crvv指出的那样,相同的输出总是被发送到stdout:"\nab\bsi\rha"。但是,您的终端和XCode将产生不同的输出(按选择)。

你的终端将执行以下操作:它看到\n,转到一个新行,它看到ab和“存储”,然后它看到\b,所以它执行非破坏性退格。这基本上意味着光标,也就是写入新字符的点,返回一个空格:

原来:

ab
  ^

遇到\b后:

ab
 ^

请注意,光标现在位于b下,因此如果产生任何后续字符,它将被覆盖。

接下来,它读入s然后i,所以我们得到:

asi
   ^

接下来,它读入\r。这是回车符,旧的打字机会将光标返回到行的开头。所以现在我们有:

asi
^

最后,它读入ha,因为光标在a下,ha将覆盖as

hai
  ^

这就是事情。请注意,您的光标仍在i下。在i之后,它不在下一个空的空间之下。因为你的程序printfprintf("\rha")之后没有打印任何东西,当终端打印你的输出时,光标将保持在i下。

那么,你的终端输出的下一个东西是什么?通常,这是正常的提示,即yourname@ubuntu。这会覆盖i,因此,你会看到像hayourname@ubuntu这样的东西。

另一方面,Xcode做的事情略有不同。它消耗\b,因此光标不会返回一个字符,并且\r被视为换行符,因此:

absi
ha

0
投票

程序总是将“\ nab \ bsi \ rha”写入其标准输出。

区别在于如何显示。

您可以使用gcc hello.c && ./a.out | xxd查看它。

00000000: 0a61 6208 7369 0d68 61                   .ab.si.ha

0
投票

\rCR(回车)代码。它将光标返回到行首。你有“ab”,然后\b是退格。以下“si”将覆盖“b”并且您具有“asi”。然后\r进入行首,“ha”被打印在“as”的位置 - 结果是“hai”。但是光标在“s”之后,当显示Bash提示时,它会替换“i”,因为它是光标后的第一个自由位置。你看到“ha {prompt-message}”。在\n之后添加\rha以查看“hai”。

© www.soinside.com 2019 - 2024. All rights reserved.