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 によって印刷された文字数を印刷しています。これが返されるものだからです。printfaddadd
あなたの関数の名前が add であることを考えると、これがあなたの意図したものであるとは思えません。
printf() は印刷された文字数を返します。この場合は明らかに 7 文字です。次に、printf() によって返された値を返し、それを印刷します。
奇妙なことをしているようです。何を期待していましたか?
printf は印刷された文字数を返します。この場合、出力長として x と y を指定して 7 文字を出力しています。return ステートメントを次のように変更した場合:
return printf("%*c%*c\n", x, '\r', y, '\r');
新しい行も出力されるため、出力は 8 になります。