我期望这行简单的代码

printf("foo\b\tbar\n");

将"o"替换为"\t"并产生以下输出

fo     bar

(假设制表位每 8 个字符出现一次)。

foo    bar

看来我的 shell 将 \b 解释为"将光标向后移动一个位置",将 \t 解释为"将光标移动到下一个制表位"。

答案

退格键和制表符都可以移动光标位置。

你的代码说:

  1. 打印"富"
  2. 将光标向后移动一格
  3. 将光标向前移动到下一个制表位
  4. 输出"条"。

为了获得您期望的输出,您需要printf("foo\b \tbar")

  1. 输出"富"
  2. 将光标向后移动一格
  3. 输出一个" “(这取代了第二个"o”)。
  4. 将光标向前移动到下一个制表位
  5. 输出"条"。

大多数时候,使用制表符和退格键来格式化程序输出是不合适的。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 settermregtabs

如果您重定向输出或仅写入文件,制表符通常会显示为少于标准 8 个字符,尤其是在"编程"编辑器和 IDE 中。

换句话说:

printf("%-8s%s", "foo", "bar"); /* this will ALWAYS output "foo     bar" */
printf("foo\tbar"); /* who knows how this will be rendered */

恕我直言,一般来说,选项卡很少适用于任何事情。

退格键'\b'是一个不同的故事……它永远不应该用于创建文本文件,因为它只会让文本编辑器吐出垃圾。

来自: stackoverflow.com