1

今日のコードにはちょっとした驚きがありました。AIX でコンパイルし、警告レベルを anal に設定して、不正な問題が潜んでいる可能性があるかどうかを確認しました。コードから何か新しいものがクロールされました。

 1540-2837 (W) '0' flag is disregarded when combined with 
               precision and 'i' printf format.

問題のある行を調べた後、それを再現するための小さなプログラムをまとめました。いくつかのプラットフォームでテストしたところ、AIX 固有のものではないことがわかりました。

以下の最初の printf は、プログラムで見つかったものを模倣しています。

#include <stdio.h>    
int main(void)
{
    int x = 3;

    printf("Format 0.3i <%0.3i>\n", x);  // prints 003, and AIX does a warning
    printf("Format  .3i <%.3i>\n", x);   // prints 003, with no warning
    printf("Format   3i <%3i>\n", x);    // prints   3, with no warning.

    return 0;
}

通常、先行ゼロが必要な場合は、「03i」の形式でうまく機能します。

ここで「%.3i」とはどういう意味ですか?

なぜそのような振る舞いをするのですか?

4

2 に答える 2

5

.X (x は数値) は「少なくとも X 桁を印刷する」ことを意味するため、%.3i は少なくとも 3 桁を印刷することを意味します。数値が 100 未満の場合は、ゼロが埋め込まれます。

printfのドキュメントから

"整数指定子 (d、i、o、u、x、X) の場合: 精度は、書き込まれる最小桁数を指定します。書き込まれる値がこの数値よりも短い場合、結果は先行ゼロで埋められます。結果が長くても、値は切り捨てられません。精度 0 は、値 0 に対して文字が書き込まれないことを意味します。"

別の概念として、「幅」(「%3i」など) があり、特定の数の文字が出力されます (必ずしも数字ではありません。指定された 0 は、「003」のように、これらの文字が 0 であることを示すために使用されます)。 " 3" のようなスペースではありません)

于 2009-02-19T22:29:11.317 に答える
0

からman 3 printf:

精度が数値変換 (d、i、o、u、x、および X) で指定されている場合、0 フラグは無視されます。

.精度を指定しているため、0は無視されます。「なんで?」について。それについては、C標準の作成者に尋ねる必要があります:)

于 2009-02-19T22:30:44.153 に答える