21

我想实现一个文本绘制功能。但我不确定它是如何\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.Numberi代表\tat位置的空格i

2.NUMBER_OF_SPACES_FOR_TAB == 4

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

4

3 回答 3

33

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

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

123456789
a       b
        c

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

于 2012-10-26T21:32:17.140 回答
19

想象一个标尺,每 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 个空格。

于 2012-10-26T21:33:17.243 回答
7

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

于 2012-10-26T21:35:00.037 回答