为什么我们在 C 语言中使用\rand \b?我知道这\b会让“hello\bworld”变成“hellworld”。但我们可以只写“hellworld”而不是“hello\bworld”。那么,它在程序中的作用是什么?这个问题描述了\bdo ,但没有阐明为什么使用它。
这在很大程度上只是历史原因。许多字符实际上可以追溯到模拟打字机!过去,您拥有带有矩阵打印机而不是显示器的计算机。那时,粗体字体是通过在同一位置打印两次来实现的。
例如,在Linux中我们使用该字符\n来换行,但在Windows中则\r\n这些字符是什么?嗯\n(换行)是将打字机头向下移动一行,\r是回车,将打字机回车返回到行首。
其中许多字符已不再使用。它们大多被认为是遗产。它们在现代编程中并没有那么有用。您可以用来\b返回并覆盖以前编写的内容,但今天您可以使用 ncurses 等库来实现相同的功能。在过去,您实际上可以使用它们来获得相当精确的内容定位,但在现代终端模拟器上,情况已不再如此。例如,旧的终端有固定的尺寸。这些大小可能尚未标准化,但它们在运行时不会改变,并且每次运行程序时对于同一台机器都是相同的。
如果我想编写一个带有某种进度条的 cli 应用程序,我可以考虑使用\band 。\r例子:
#include <stdio.h>
#include <unistd.h>
int main(void) {
    int n = 0;
    while(n<=100) {
        printf("\rProgress: %d\%", n);
        fflush(stdout);
        sleep(1);
        n+=10;
    }
}
\b您可以使用而不是实现相同的效果\r,但大多数情况下,重新打印整行会更容易。我看不到任何可以\b在代码中使用的情况。
如果您想在基于文本的游戏中模拟人类书写,可以做类似的事情。但我想说,这些主要适用于您没有时间和/或精力学习如何使用正确的现代方法的情况。
我们看一下ascii表中的前32个字符:
0   Null char
1   Start of Heading
2   Start of Text
3   End of Text
4   End of Transmission
5   Enquiry
6   Acknowledgment
7   Bell
8   Back Space
9   Horizontal Tab
10  Line Feed
11  Vertical Tab
12  Form Feed
13  Carriage Return
14  Shift Out / X-On
15  Shift In / X-Off
16  Data Line Escape
17  Device Control 1 (oft. XON)
18  Device Control 2
19  Device Control 3 (oft. XOFF)
20  Device Control 4
21  Negative Acknowledgement
22  Synchronous Idle
23  End of Transmit Block
24  Cancel
25  End of Medium
26  Substitute
27  Escape
28  File Separator
29  Group Separator
30  Record Separator
31  Unit Separator
几乎所有这些都被其他东西所取代。例如通过更高级别的协议,如 tcp 等,也可以通过 ncurses 等库。在 C 中,空字符对于字符串很有用,但它可以通过其他方式解决,例如在将数组传递给函数时可以检索数组的大小。