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
A) これは、printf で行うには完全にクレイジーなことです。しかし、あなたが尋ねたので...
B) は%*c
、printf の次の 2 つの引数を受け取り、それらを幅と文字として解釈するように指示します。指定された幅のフィールドにその文字を出力します。この場合、x
文字 を含むフィールド全体を出力します\r
。y
と についても同じです\r
。Printf は、印刷された文字の合計数を返します。この場合はx+y
です。
したがって、出力は実際にはx-1
スペース、\r
文字、y-1
スペース、別の\r
文字 (または文字が左揃えですか?) の後にSum = 7
.
printf
出力文字数を返します。%*c
文字を出力し、引数で指定された幅にパディングすることを意味します。つまり、そのprintf("%*c", 3, '\r')
前に 2 つのスペースがあるキャリッジ リターンを出力することを意味します。printf("%*c%*c", n, '\r', m, '\r')
したがって、n
+m
文字を出力します。これn
は、最初の を埋めるため\r
のm
- 1 スペース、2 番目を埋めるための - 1 スペース\r
、および 2 つのキャリッジ リターンです。そのため、7 が返されます。
キャリッジ リターンは行の先頭に戻るため、これらのn
+m
文字を印刷した後、次に印刷されるものが行の先頭に表示されます。つまり"Sum = "
、最初の printf の出力を上書きします。
nullターミネータを除く、印刷された文字数を返すマニュアルショーを参照してください。最初の引数はフィールド幅 (つまり、それぞれ 3 と 4) で、2 番目の引数は実際に出力される文字です。この場合、文字はキャリッジ リターン ( ) であり、おそらく端末では表示されません。2 つの文字はパディング付きで出力されるため、長さ 7 の文字列が出力され、7 が返されます。printf
%*c
\r
スペースとキャリッジ リターンがわからないため、何も出力されていないように見えますが、出力をファイルまたはhexdump
にパイプしてみてください。
成功した場合、 printfは印刷された文字数を返します。したがって、あなたのprintf
呼び出しは、関数でmain
によって印刷された文字数を印刷しています。これが返されるものだからです。printf
add
add
あなたの関数の名前が add であることを考えると、これがあなたの意図したものであるとは思えません。
printf() は印刷された文字数を返します。この場合は明らかに 7 文字です。次に、printf() によって返された値を返し、それを印刷します。
奇妙なことをしているようです。何を期待していましたか?
printf は印刷された文字数を返します。この場合、出力長として x と y を指定して 7 文字を出力しています。return ステートメントを次のように変更した場合:
return printf("%*c%*c\n", x, '\r', y, '\r');
新しい行も出力されるため、出力は 8 になります。