2012-10-26 66 views
11

我想實現一個文本繪圖功能。但我不知道如何\t的作品,這意味着我不知道我應該打印多少空間\t製表符( t)有多少空格?

我想出了下面的算法:

a)每個\t代表最多NUMBER_OF_SPACES_FOR_TAB空間。 b)如果\t出現在相應位置的最後一行,則該行的\t應與最後一行的\t對齊。

實施例:

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

應該打印:

a11112222b 
34444c 

其中:

i 1.Number表示\t的空間在位置i

2. NUMBER_OF_SPACES_FOR_TAB == 4

有誰知道標準算法?提前致謝。

+0

文本編輯器通常對齊每個第X列的製表符,與其他字符無關 – alestanis

+0

您猜對了還是您知道嗎?您所描述的規則並不是標籤的常用規則,但也許您已被告知要使用它們。 – john

+0

@john我只是猜測是否有標準算法 –

回答

18

製表符應該前進到下一個製表位。從歷史上看,每隔8個字符就有一個製表符,儘管當前常用的值較小,大多數編輯器都可以配置。

我希望你的輸出如下所示:

123456789 
a  b 
     c 

的算法是在零開始列數,然後增加它爲每個字符輸出。當您到達選項卡時,輸出n-(c%n)空格,其中c是列號(基於零),n是製表符間距。

編輯:公式一開始我錯了一年多,沒有人打電話給我。抱歉。現在已經修復了。

+0

我提到的算法呢? –

+2

今天通常使用4個空格。對於具有許多級別的語言,2也並不少見。 – rekire

+0

@rekire和Torvalds先生仍然建議使用8,他有一個很好的理由:) – 2012-10-26 21:36:06

13

想象一下,帶有製表位的標尺每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個空格。

+0

'foo'後面的標籤代表5個空格嗎?如果是8個空格,我會認爲它會更好。 –

+0

標準庫可以理解'列'嗎?標籤和空格的數學是清楚的,但它不是基於'列'的參考? –

+0

'column'是一個假設的變量,你需要跟蹤自己。標準庫不知道光標的當前列位置,不。 –

4

製表符轉換到下一個製表位。默認情況下,每8個空格就有一個。但在大多數shell中,您可以輕鬆將其編輯爲任意數量的空間(linux中的配置文件首選項,在vim中設置tabstop)。