21

テキスト描画機能を実装したい。しかし\t、どのように機能するのかわかりません。つまり、印刷するスペースの数がわからないということです\t

私は次のアルゴリズムを思いつきました:

a) それぞれは最大でスペース\tを表します。NUMBER_OF_SPACES_FOR_TABb)\t対応する位置の最終行に表示される場合\t、この行は最終行の に揃える必要があります\t

例:

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

印刷する必要があります:

a11112222b
34444c

どこ:

1.数字は位置iのスペースを表します\ti

2.NUMBER_OF_SPACES_FOR_TAB == 4

標準アルゴリズムを知っている人はいますか?前もって感謝します。

4

3 に答える 3

33

タブ文字は、次のタブ ストップに進む必要があります。歴史的に、タブ ストップは 8 文字ごとでしたが、現在はより小さな値が一般的に使用されており、ほとんどのエディターを構成できます。

出力は次のようになると思います。

123456789
a       b
        c

アルゴリズムは、列カウントをゼロから開始し、文字出力ごとに増分します。タブに到達すると、は列番号 (0 ベース) で、n-(c%n)はタブ間隔を表します。cn

于 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 スペースごとに 1 つです。しかし、ほとんどのシェルでは、必要な数のスペースになるように簡単に編集できます (Linux ではプロファイル設定、vim ではタブストップを設定します)。

于 2012-10-26T21:35:00.037 に答える