【问题标题】:How many spaces for tab character(\t)?制表符(\t)有多少个空格?
【发布时间】:2012-10-17 04:15:27
【问题描述】:

我想实现一个文字绘制功能。但我不确定\t 是如何工作的,这意味着我不知道应该为\t 打印多少空格。

我想出了以下算法:

a) 每个\t 最多代表NUMBER_OF_SPACES_FOR_TAB 个空格。 b) 如果\t出现在最后一行的相应位置,则该行的\t应与最后一行的\t对齐。

例子:

printf("a\t\tb\n");
printf("\t\tc\n");

应该打印:

a11112222b
34444c

地点:

1.Number i代表\t在位置i的空格

2.NUMBER_OF_SPACES_FOR_TAB == 4

有人知道标准算法吗?提前致谢。

【问题讨论】:

  • 文本编辑器通常在每 X 列对齐制表符,独立于其他字符
  • 你猜还是知道?您描述的规则不是标签的常用规则,尽管您可能被告知要使用它们。
  • @john 我只是猜测是否有标准算法
  • 通常的规则就是alestanis所说的。
  • 还有,请把制表符当作自己的字符。永远不要认为它是一堆空格的简写。我无法计算我见过的源文件的数量,其中一些脑死亡的编辑器完全破坏了缩进,因为它被编程为将制表符视为固定数量的空格。它是一个独立的角色,一个具有自身非常重要意义的角色,一个应该受到尊重的角色。

标签: c++ c printf


【解决方案1】:

制表符应该前进到下一个制表位。从历史上看,制表位是每 8 个字符,但现在通常使用较小的值,并且大多数编辑器都可以配置。

我希望您的输出如下所示:

123456789
a       b
        c

算法是从零开始列计数,然后为每个字符输出增加它。当您到达一个制表符时,输出n-(c%n) 空格,其中c 是列号(从零开始),n 是制表符间距。

【讨论】:

  • 通常是今天使用的 4 个空格。对于具有多个级别的语言,2 级也并不少见。
  • @H2CO3:如果您阅读了 Torvalds 先生经常在互联网上发布的任何内容,那么他​​的理由是有争议的......无论如何,任何人推荐的标签空间都没有'不太了解标签是什么。制表符不是空格。一个制表符缩进一级,不是1个空格,也不是2,也不是4,也不是8,也不是任何其他数字。常见的借口从“但它看起来像这样”到“我们一直这样做”到“我必须与之合作的一些人使用不能做标签的编辑器”,但没有一个借口是真正有效的。跨度>
  • 或者,换个说法,声称一个制表符是 8 个空格就像声称 å 与俄语 N,Я 是俄语 R。
  • @Damon:感谢上帝。一个理智的人。我现在遇到的大多数人都发誓说制表符缩进是邪恶的。他们永远无法很好地解释原因。它开始让我发疯了!
  • @MarkRansom 选项卡没有歧义。它们带有意义。一个制表符 = 一个缩进级别。我想显示该缩进级别的宽度是我的选择。我不想被极具影响力的代码开发人员强迫查看缩进宽度为 8 的代码。如果该代码使用制表符正确格式化,我可以使用缩进 3 来查看它,而 Torvalds 先生可以查看与八相同的代码。我的编辑,我选择它的显示方式。当某人或某些工具认为他们可以用八个空格替换制表符时,问题就开始了。这不是标签的含义。
【解决方案2】:

想象一个标尺,每 8 个空格就有一个制表位。制表符会将文本与下一个制表位对齐。

                                0       8       16      24      32      40
                                |.......|.......|.......|.......|.......|
printf("\tbar\n");              \t      bar
printf("foo\tbar\n");           foo\t   bar
printf("longerfoo\tbar");       longerfoo\t     bar

要计算下一个制表位的位置,请使用当前的column

nextTabStop = (column + 8) / 8 * 8

/ 8 * 8 部分有效地将结果截断为最接近的 8 倍数。例如,如果您在第 11 列,则 (11 + 8) 为 19,19 / 8 为 2,2 * 8 为16. 所以第 11 列的下一个制表位在第 16 列。

在文本编辑器中,您可以将制表位配置为更小的间隔,例如每 4 个空格。如果您要在终端上模拟选项卡的外观,您应该坚持每个选项卡有 8 个空格。

【讨论】:

  • foo后面的tab代表5个空格?我认为如果是 8 个空格会更好。
  • 标准库是否理解“列”?制表符和空格的数学很清楚,但它不是基于“列”的引用吗?
  • column 是您需要跟踪自己的假设变量。标准库不知道光标当前的列位置,不知道。
【解决方案3】:

一个制表符转移到下一个制表位。默认情况下,每 8 个空格就有一个。但在大多数 shell 中,您可以轻松地将其编辑为您想要的任意数量的空格(linux 中的配置文件首选项,vim 中设置 tabstop)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多