转义序列在C中产生意外的输出
我是C编程语言的初学者,最近我研究了转义序列 。
\n means newline \b means backspace \r means carriage-return
当我在下面的程序中应用这些时,我就得到输出为hai ,任何人都可以解释一下,怎么样?
main() { printf("\nab"); printf("\bsi"); printf("\rha"); }
\r
实际上是回车符(它将光标移到行的开头)。
你的程序输出一个新行( \n
),然后是“ab”,然后退格( \b
)(在b上)“si”,所以你现在在屏幕上有“asi”。
\r
将光标移动到行的开头,然后输出“ha”,在屏幕上留下“hai”。
第一条指令将在新行上打印ab
( \n
):
>ab
第二条指令在打印si
之前会产生退格 ( \b
):
>asi
然后最后一个将在打印之前返回回车符 ( \r
):
>hai
首先printf
将打印ab
然后\b
将进行退格并打印si
以便最终打印成为asi
。
现在在最后\r
将光标移动到开头并打印ha
将替换前两个字符并使最终字符串为hai
( ha
来自最后一个语句,而i
来自之前的结果。)
因为你在第一个\n
之后在同一行写了所有内容:
printf( "\nab" ); // -> ab on a new line
线路状态: ab
printf( "\bsi" );
这意味着ab
减去b
因为退格,然后你将si
添加到该行。
线路状态: asi
最后:
printf( "\rha" );
意味着你回到行的开头写ha
。
它导致了hai
。
\r
是回车 ,而不是换行 。
不, '\r'
不是换行符, '\n'
实际上是换行符。 恰好是许多现代系统使用'\n'
作为换行和回车,使其成为“换行符”。
'\r'
是回车符 ,它将光标返回到行的开头。
\ b用于退格。 也就是说,它删除了刚才写的字符。
\ r \ n是将光标返回到当前行中最左侧的位置。
设z表示光标。
声明之后。
\n abz
退格后。
az
声明二后。
asiz
回来后。
zbi
声明三后
haiz
在你的代码中
-
\ r
\r means Carriage Return, which means: return the cursor to the beginning of the line in more simple words we can say that it's deleting each character from the active position upto the beginning.
-
\ n
\n mean New Line
-
\ b
\b mean Backspace
让我们一步一步:
absiha
首先,处理退格。 请注意,即使它是“非擦除”,输出的下一个字符也会覆盖后退的字符:
asiha
现在,回车意味着回到行的开头。 所以“ha”覆盖了“asi”中的“as”:
hai
现在,光标当前位于i上,因此要输出的下一个字符将覆盖i。