テキスト描画機能を実装したい。しかし、\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
誰もが標準アルゴリズムを知っていますか?前もって感謝します。
タブ文字は次のtab stopに進む必要があります。歴史的にタブストップは8文字ごとでしたが、今日ではより小さな値が一般的に使用されており、ほとんどのエディターを構成できます。
出力は次のようになります。
_123456789
a b
c
_
このアルゴリズムは、列カウントをゼロから開始し、文字出力ごとに列カウントを増やします。タブに到達すると、n-(c%n)
スペースを出力します。c
は列番号(ゼロベース)、n
はタブ間隔です。
編集:私がもともと持っていた式は1年以上の間間違っていた、と誰も私にそれを呼ばなかった。ごめんなさい。現在修正されています。
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つのスペースを使用する必要があります。
タブ文字は次のタブストップに移動します。デフォルトでは、8スペースごとに1つです。ただし、ほとんどのシェルでは、任意の数のスペースに簡単に編集できます(Linuxのプロファイル設定、vimでtabstopを設定)。