我对以下代码有点困惑:
#include <stdio.h>
int main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
return 0;
}
当我在Linux上执行程序时,它会打印出来
ha
但是当我在Xcode上执行它时,它会打印出来
absi
ha
我对“\ t”,“\ b”和“\ r \ n”有点困惑,我无法弄清楚程序是如何工作的。
\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之后,它不在下一个空的空间之下。因为你的程序printf
在printf("\rha")
之后没有打印任何东西,当终端打印你的输出时,光标将保持在i下。
那么,你的终端输出的下一个东西是什么?通常,这是正常的提示,即yourname@ubuntu
。这会覆盖i,因此,你会看到像hayourname@ubuntu
这样的东西。
另一方面,Xcode做的事情略有不同。它消耗\b
,因此光标不会返回一个字符,并且\r
被视为换行符,因此:
absi
ha
程序总是将“\ nab \ bsi \ rha”写入其标准输出。
区别在于如何显示。
您可以使用gcc hello.c && ./a.out | xxd
查看它。
00000000: 0a61 6208 7369 0d68 61 .ab.si.ha
\r
是CR
(回车)代码。它将光标返回到行首。你有“ab”,然后\b
是退格。以下“si”将覆盖“b”并且您具有“asi”。然后\r
进入行首,“ha”被打印在“as”的位置 - 结果是“hai”。但是光标在“s”之后,当显示Bash提示时,它会替换“i”,因为它是光标后的第一个自由位置。你看到“ha {prompt-message}”。在\n
之后添加\rha
以查看“hai”。