退格转义可以取消换行转义吗?

Can backspace escape cancel a new-line escape?

我正在与 ubuntu 合作。 代码:

printf("Hello\n\b world");

我进入终端:

Hello
 world

为什么退格不取消\n? 字符有层次结构吗?

如何删除特殊字符?

您的问题超出了 C 语言的范围:printf("Hello\n\b world"); 从格式字符串输出字节,可能根据换行符的文本模式处理进行翻译:

  • 在 unix 系统上,字节未修改地输出到系统句柄。

  • 在 Microsoft 遗留系统上,换行符转换为 CR LF,其他字节未修改地传输。

如果标准输出指向一个文件,该文件将包含换行符和退格符的翻译(在大多数系统上为 0x08)。

如果标准输出转到终端,则退格特殊字符的处理不在程序的控制范围内:终端(硬件、虚拟、本地或远程...)将按照编程和配置执行其任务。 .. 大多数终端将光标在它们控制的任何显示器上向左移动一个位置,有些终端会擦除该位置的字符。如果光标已经在第 1 列,无论退格键是否将光标移回上一行的末尾,这又取决于系统,无论这意味着什么。许多系统不这样做并将光标保持在第 1 列。这似乎与您观察到的行为一致。

这是 C 标准(在 C 2018 5.2.2 2 中)关于换行符的说法:

Moves the active position to the initial position of the next line.

和退格键:

Moves the active position to the previous position on the current line. If the active position is at the initial position of a line, the behavior of the display device is unspecified.

请注意,退格字符未指定为删除前一个字符。指定在显示设备上引起某种动作。

回想一下,C 是在电传打字机和其他物理打印设备普遍使用的时代开发的。其中许多设备只能将纸张向上推。一旦一个换行符导致纸张被向上推,就没有办法再向下移动了。

此外,一些早期的视频显示器或驱动它们的软件模拟物理打印并且不支持倒退一行,至少在它们的某些操作模式中是这样。

在可以自由移动光标的显示器上,不清楚行首的退格键应该做什么。考虑一个有 80 列的显示,编号从 1 到 80,打印的最后一行包含 40 个字符,后跟一个新行。当我们退格时,我们将光标移回那一行,但是我们将它移到哪一列呢?第 80 列,显示的最后一个?还是第 40 列,最后一个打印内容的列?不同的设备可能会以不同的方式处理这个问题。请注意,后一种选择需要设备记住每行的长度,这会增加早期计算机的负担。 (我高中的廉价显示终端没有足够的内存来记住 24×80 显示器中的所有文本。我认为它只有 1024 字节,足够 12.8 行 80 个字符。如果你写完整的文本行,它会滚动显示较早的行,只保留最后 12 行。)

由于这些行为差异,C 标准没有指定从行首开始退格的详细信息。

你问的是取消“换行转义”的“退格转义”。但是,转义序列在这里无关紧要;它们与字符的操作处于不同的表示层:

  • 在字符串文字中,\b\n 是转义序列。当编译器翻译程序时,它用退格符和换行符替换它们。然后它们不再是转义序列;它们只是字符串中的字符。
  • 当您用 printf 写入字符时,它们将作为流中的字符传输。
  • 当字符被发送到显示设备(因为这是流所连接的设备)时,它们会产生上面引用的 5.2.2 2 文本中的操作。

那些转义序列\b\n代表control characters。控制字符是一种特殊字符,它以某种特殊方式控制输出设备的行为。当你说

printf("A");

它将(普通)字符 A 打印到屏幕上。但是当你说

printf("\n");

它不打印任何内容,而是将光标向下移动到下一行的开头。

现在,\b的意思是不是“取消左边的字符”。控制字符 \b 不会“取消”任何内容。如果可以的话,它所做的只是将光标向左移动一个字符。但是如果光标已经在左边缘,它可能不能。

曾几何时,尤其是当输出到实际打印在纸上的打印机时,通常会做

printf("this is u\b_n\b_d\b_e\b_r\b_l\b_i\b_n\b_e\b_d\b_\n");

printf("this is b\bbo\bol\bld\bd\n");

通过套印打印下划线或粗体字。这些示例显然依赖于 \b 的向左移动一个行为。这些例子证明 \b 的行为与“取消”完全不同!

听起来您认为 \b 可能会以某种方式影响它所属的字符串。 听起来您认为 \b 可能会以某种方式被您的 C 编译器或 C 库处理。 听起来您认为字符串 "abc\bdef" 可能会转换为 "abdef"。 但是 none 这些事情是真的。退格字符 \b 由您的屏幕或打印机或您的程序“打印”到的任何输出设备解释。 \b 等控制字符的解释主要取决于您的输出设备。它大多不是 C 编程语言的 属性。