提问者:小点点

\T和\B做什么?


我希望这行简单的代码

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

将“o”替换为“\t”并生成以下输出

fo     bar

(假设制表位每8个字符出现一次)。 恰恰相反,我得到了

foo    bar

我的shell似乎将\b解释为“将光标向后移动一个位置”,将\t解释为“将光标移动到下一个制表位”。 这种行为是否特定于运行代码的shell? 在不同的系统上,我应该期待不同的行为吗?


共3个答案

匿名用户

Backspace和tab都移动光标位置。 这两个字符都不是真正的“可打印”字符。

你的代码说:

  1. 打印“foo”
  2. 将光标向后移动一个空格
  3. 将光标前移到下一个制表符停止
  4. 输出“bar”。

要获得期望的输出,需要printf(“foo\b\tbar”)。 注意额外的“空间”。 上面说:

  1. 输出“foo”
  2. 将光标向后移动一个空格
  3. 输出一个“”(它替换第二个“o”)。
  4. 将光标前移到下一个制表符停止
  5. 输出“bar”。

大多数时候,使用制表符和退格键来格式化程序输出是不合适的。 学习使用printf()格式说明符。 选项卡的呈现可能会因查看输出的方式而有很大变化。

这个小脚本显示了一种改变终端选项卡呈现的方法。 在Ubuntu+GNOME-TERMINAL上测试:

#!/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 */

IMHO,选项卡通常很少适合任何东西。 一个异常可能是为需要制表符分隔值输入文件(类似于逗号分隔值)的程序生成输出。

退格'\b'则是另一回事。。。 它永远不应该用于创建文本文件,因为它只会让文本编辑器吐出垃圾。 但是它在编写交互式命令行程序方面确实有许多应用程序,这些应用程序无法单独使用格式字符串来完成。 如果您发现自己非常需要它,请查看“ncurses”,它可以让您更好地控制输出在终端屏幕上的位置。 而且通常,因为现在是2011年而不是1995年,对于高度交互的程序来说,GUI通常更容易处理。 但也有例外。 比如为新的脚本语言编写telnet服务器或控制台。

匿名用户

不,这或多或少是他们的本意。

在C语言(以及许多其他语言)中,您可以使用\表示法插入难以看到的/类型字符:

  • \a是警报/铃声
  • \b是Backspace/Rubout
  • \n为换行
  • \r是回车(返回到左边距)
  • \t是选项卡

还可以使用\0nnn指定任何字符的八进制值,或者使用\xnn指定任何字符的十六进制值。

  • 例如:_的ASCII值是八进制137,十六进制5F,因此如果您的键盘没有_键或其他键,也可以键入\0137\x5F。 这对于控制字符(如NUL(\0)和ESC(\033)
  • 更有用

就像有人发帖(然后在我还没来得及+1之前就删除了他们的答案)一样,还有一些不太常用的答案:

  • \f是表单提要/新页(从打印机弹出页)
  • \v是垂直选项卡(在同一列下移一行)

在屏幕上,\f的工作方式通常与\v相同,但在某些打印机/电传打字机上,它将一直工作到下一张表单/纸张。

匿名用户

C标准(实际上是C99,我不是最新的)说:

表示执行字符集中的非图形字符的字母转义序列旨在在显示设备上产生如下动作:

\b(退格键)将活动位置移动到当前行上一个位置。 [...]

\t(水平选项卡)将活动位置移动到当前行上的下一个水平制表位置。 [...]

两者都只是移动活动位置,都不应该在另一个字符上或上方写任何字符。 要用空格覆盖,您可以尝试:puts(“foo\b\tbar”);。但是请注意,在某些显示设备上,例如菊花轮打印机,o将显示透明空格。