如何解决退格转义可以取消换行转义吗?
我正在使用 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 中):
将活动位置移动到下一行的初始位置。
和退格:
将活动位置移动到当前行上的前一个位置。如果活动位置在一行的初始位置,则显示设备的行为是未指定的。
请注意,没有指定退格字符来擦除前一个字符。指定在显示设备上引起某种动作。
回想一下,C 是在电传打字机和其他物理打印设备普遍使用的时代开发的。许多这些设备只能向上推动纸张。一旦换行符导致纸张被向上推,就无法再次向下移动。
此外,一些早期的视频显示器或驱动它们的软件模拟物理打印并且不支持返回一行,至少在它们的某些操作模式中是这样。
在可以自由移动光标的显示器上,不清楚行首的退格应该做什么。考虑一个显示,它有 80 列,编号从 1 到 80,打印的最后一行包含 40 个字符,后跟一个新行。当我们退格时,我们将光标移回该行,但是我们将它移到哪一列?第80列,显示的最后一个?还是第 40 列,即最后一个打印内容的列?不同的设备可能会以不同的方式处理这个问题。请注意,后一种选择要求设备记住每行的长度,这增加了早期计算机器的负担。 (我高中的廉价显示终端没有足够的内存来记住 24×80 显示器中的所有文本。我认为它只有 1024 个字节,足够 12.8 行 80 个字符。如果你写完整的文本行,它会将较早的行从显示屏上滚动,只保留最后 12 行。)
由于这些行为的变化,C 标准没有指定从行首开始退格的细节。
您询问取消“换行转义”的“退格转义”。但是,转义序列在这里无关紧要;它们与字符的操作处于不同的表示层:
- 在字符串文字中,
HttpResponseNotFound
和\b
是转义序列。当编译器翻译程序时,它会用退格字符和换行符替换它们。然后它们不再是转义序列;它们只是字符串中的字符。 - 当您使用
\n
写入字符时,它们将作为流中的字符传输。 - 当字符被发送到显示设备时(因为这是流所连接的设备),它们会产生上面引用的 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"
。
但这些都不是真的。退格字符 \b
由您的屏幕或打印机或您的程序“打印”到的任何输出设备解释。 \b
等控制字符的解释主要取决于您的输出设备。它主要不是 C 编程语言的属性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。