web-dev-qa-db-ja.com

タブ文字(\ 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

どこ:

1.番号iは、iの位置にある\tのスペースを表します

2 .NUMBER_OF_SPACES_FOR_TAB == 4

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

17
Chao Zhang

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

出力は次のようになります。

_123456789
a       b
        c
_

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

編集:私がもともと持っていた式は1年以上の間間違っていた、と誰も私にそれを呼ばなかった。ごめんなさい。現在修正されています。

26
Mark Ransom

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 partは、結果を8の倍数に効果的に切り捨てます。たとえば、列11にいる場合、(11 + 8)は19であり、19/8は2であり、2 * 8は16です。列11のタブストップは列16にあります。

テキストエディタでは、4つのスペースごとなど、より短い間隔でタブストップを設定できます。端末でタブがどのように見えるかをシミュレートしている場合、タブごとに8つのスペースを使用する必要があります。

14
John Kugelman

タブ文字は次のタブストップに移動します。デフォルトでは、8スペースごとに1つです。ただし、ほとんどのシェルでは、任意の数のスペースに簡単に編集できます(Linuxのプロファイル設定、vimでtabstopを設定)。

5
Whyrusleeping