0

ケース3でスペースの数が異なる理由 \t 文字によって結果がどのように影響を受けるか。

(-) は (\t) によってスペースを参照します

case 1
 void main()
    {
        int a,b;
        printf("%d",printf("hello%d\t",scanf("%d%d",&a,&b)));
    }

ここで出力は> hello2-7です

case 2
 void main()
    {
        int a,b;
        printf("%d",printf("hello\t%d",scanf("%d%d",&a,&b)));
    }

ここで出力は> hello-27です

case 3
 void main()
    {
        int a,b;
        printf("%d",printf("\thello%d",scanf("%d%d",&a,&b)));
    }

ここで出力は次のとおりです>--------hello27 3番目のケースで8つのスペースがあるのはなぜですか。

4

5 に答える 5

8

ほとんどのターミナル プログラムでは、8 列ごとにタブ ストップが設定されます。そのため、出力は次のように決定されると予想されます (出力が少し異なることはわかっています。以下で説明します)。

.                                column
.                                   1         2
input                      12345678901234567890
"%d",printf("hello%d\t"    hello2__7
"%d",printf("hello\t%d"    hello___27
"%d",printf("\thello%d"    ________hello27

これを理解するには、(不必要に複雑な) コードの評価の順序を理解する必要があります。最初の行を調べていprintfます...

printf("%d",printf("hello%d\t",scanf("%d%d",&a,&b)));

上記では、左側への引数は、それ自体を出力する前に準備する必要があり、それらの引数には右側を呼び出した結果が含まれます。その右側の出力は、標準入力から読み取られた引数の数です。これは、2 を入力した場合は 2 であり、次にタブを入力すると、右側は出力を終了し、印刷された文字数を示すために「7」を返します。左手で。タブで画面の 9 列目に移動すると予想されますが、これは 7 の前に 2 つのスペースがあることを示唆していますが、あなたの質問によると、1 を観察しているとのことです。 24 桁目などはタブ ストップになります。 printf printfprintfhelloscanfprintfprintf

タブの詳細

TAB 文字の普遍的な解釈はありません\t...どのようにレンダリングされるかは、使用しているターミナル ソフトウェアまたはレンダリング デバイス (xterm、vt220、vt100 ターミナル、MS-DOS コマンド ウィンドウ、プリンター、IDE、テキスト エディターなど) によって異なります。 .)。

一部の表示/印刷/フォーマット プログラムでは、N 文字ごとにタブ ストップがあると見なされます (N は多くの場合 8 です)。そのため、最初の列から 8 番目の列までタブを発行すると、9 番目の列に移動します。 9 列目から 16 列目までのタブは、17 列目などに移動します。しかし、多くのプログラムには、タブ配置のために任意の列を設定する方法があります。MS Word などの一部のプログラムでは、タブ ストップ間の文字数が変化する可変幅フォントを使用できます。Word にインポートしたテキストを C++ プログラムで印刷すると、取得するのに必要なタブ数を計算することが事実上不可能になる場合があります。出力の目的の配置 - 通常は、値の間に 1 つのタブを配置し、Word 内でタブ ストップを変更してすべてが適切に見えるようにするか、Courier などの固定幅フォントを使用する方が簡単です。

C++ IDE では、多くの場合、タブ位置ごとに列の値 (上記の「N」) を設定できます。4 と 8 はどちらも一般的な設定です。多くの場合、8 は、ソース コードのインデントがタブとスペースを組み合わせて目的の左側に到達することを意味します。 -column: 単純なカーソル移動の実装でナビゲートするのはちょっと厄介です。多くの人は、「タブが押されたときにスペースを挿入する」オプションを設定することを好みます。これにより、ファイルは常に実際のスペースで保存され、さまざまな表示/印刷ソフトウェアでより予測どおりに表示されます。

于 2013-06-24T06:29:23.553 に答える
7

TAB には、レンダリング時に指定されたスペースしかありません (実際にはどの文字もそうです)。ただし、タブとの微妙な違いの 1 つは、次の「仮想列」に進むことを意味するものと見なされることが多いことです (もっと適切な用語があると思います)。これらの仮想列は、たとえば 8 文字幅です。ただし、この幅は頻繁に変更できます。

これは醜いグラフィックでn..-、「仮想列」をT..t表し、タブによって「占有」されたスペースを表します。

                1------2-------3-------
hello\tworld helloTttworld
\thelloworld Tttttttthelloworld
hello\t\tworld helloTttTttttttttworld
于 2013-06-24T06:28:36.297 に答える
6

C99およびC11では、

\t (水平タブ) アクティブな位置を現在の行の次の水平タブ位置に移動します。アクティブな位置が、最後に定義された水平集計位置またはそれを過ぎた場合、表示デバイスの動作は規定されていません。

一方、C++03 と C++11 は C との '\t' の違いを指定していません。

于 2013-06-24T06:27:08.940 に答える
5

\tスペースは含まれません。\t 異なる長さで表示できる適切な文字ですが、1文字のみです。

于 2013-06-24T06:23:40.513 に答える