2

printf()ステートメントでの幅の使用は何ですか? 以下の例で出力が 7 なのはなぜですか?

コード

int add(int x, int y)
{
    return printf("%*c%*c",  x, '\r',  y, '\r');
}

int main()
{
    printf("Sum = %d", add(3, 4));
    return 0;
}

出力

合計 = 7

4

6 に答える 6

4

A) これは、printf で行うには完全にクレイジーなことです。しかし、あなたが尋ねたので...

B) は%*c、printf の次の 2 つの引数を受け取り、それらを幅と文字として解釈するように指示します。指定された幅のフィールドにその文字を出力します。この場合、x文字 を含むフィールド全体を出力します\ryと についても同じです\r。Printf は、印刷された文字の合計数を返します。この場合はx+yです。

したがって、出力は実際にはx-1スペース、\r文字、y-1スペース、別の\r文字 (または文字が左揃えですか?) の後にSum = 7.

于 2012-07-23T05:28:05.000 に答える
3

printf出力文字数を返します。%*c文字を出力し、引数で指定された幅にパディングすることを意味します。つまり、そのprintf("%*c", 3, '\r')前に 2 つのスペースがあるキャリッジ リターンを出力することを意味します。printf("%*c%*c", n, '\r', m, '\r')したがって、n+m文字を出力します。これnは、最初の を埋めるため\rm- 1 スペース、2 番目を埋めるための - 1 スペース\r、および 2 つのキャリッジ リターンです。そのため、7 が返されます。

キャリッジ リターンは行の先頭に戻るため、これらのn+m文字を印刷した後、次に印刷されるものが行の先頭に表示されます。つまり"Sum = "、最初の printf の出力を上書きします。

于 2012-07-23T05:29:43.260 に答える
1

nullターミネータを除く、印刷された文字数を返すマニュアルショーを参照してください。最初の引数はフィールド幅 (つまり、それぞれ 3 と 4) で、2 番目の引数は実際に出力される文字です。この場合、文字はキャリッジ リターン ( ) であり、おそらく端末では表示されません。2 つの文字はパディング付きで出力されるため、長さ 7 の文字列が出力され、7 が返されます。printf%*c\r

スペースとキャリッジ リターンがわからないため、何も出力されていないように見えますが、出力をファイルまたはhexdumpにパイプしてみてください。

于 2012-07-23T05:29:13.207 に答える
1

成功した場合、 printfは印刷された文字数を返します。したがって、あなたのprintf呼び出しは、関数でmain によって印刷された文字数を印刷しています。これが返されるものだからです。printfaddadd

于 2012-07-23T05:25:56.343 に答える
0

あなたの関数の名前が add であることを考えると、これがあなたの意図したものであるとは思えません。

printf() は印刷された文字数を返します。この場合は明らかに 7 文字です。次に、printf() によって返された値を返し、それを印刷します。

奇妙なことをしているようです。何を期待していましたか?

于 2012-07-23T05:27:42.017 に答える
0

printf は印刷された文字数を返します。この場合、出力長として x と y を指定して 7 文字を出力しています。return ステートメントを次のように変更した場合:

return printf("%*c%*c\n",  x, '\r',  y, '\r'); 

新しい行も出力されるため、出力は 8 になります。

于 2012-07-23T05:26:51.550 に答える