我期望这行简单的代码
printf("foo\b\tbar\n");
将"o"替换为"\t"并产生以下输出
fo bar
(假设制表位每 8 个字符出现一次)。
foo bar
看来我的 shell 将 \b 解释为"将光标向后移动一个位置",将 \t 解释为"将光标移动到下一个制表位"。
答案
退格键和制表符都可以移动光标位置。
你的代码说:
- 打印"富"
- 将光标向后移动一格
- 将光标向前移动到下一个制表位
- 输出"条"。
为了获得您期望的输出,您需要printf("foo\b \tbar")
。
- 输出"富"
- 将光标向后移动一格
- 输出一个" “(这取代了第二个"o”)。
- 将光标向前移动到下一个制表位
- 输出"条"。
大多数时候,使用制表符和退格键来格式化程序输出是不合适的。printf()
格式说明符。
这个小脚本展示了一种改变终端选项卡渲染的方法。
#!/bin/bash
tabs -8
echo -e "\tnormal tabstop"
for x in `seq 2 10`; do
tabs $x
echo -e "\ttabstop=$x"
done
tabs -8
echo -e "\tnormal tabstop"
另请参阅man setterm
和regtabs
。
如果您重定向输出或仅写入文件,制表符通常会显示为少于标准 8 个字符,尤其是在"编程"编辑器和 IDE 中。
换句话说:
printf("%-8s%s", "foo", "bar"); /* this will ALWAYS output "foo bar" */
printf("foo\tbar"); /* who knows how this will be rendered */
恕我直言,一般来说,选项卡很少适用于任何事情。
退格键'\b'
是一个不同的故事……它永远不应该用于创建文本文件,因为它只会让文本编辑器吐出垃圾。