C での printf ステートメントのデコード (Printf 入門)
質問
私は 1998 年の古いコードを 21 世紀に持ち込むことに取り組んでいます。プロセスの最初のステップの 1 つは、printf ステートメントを次のように変換することです。 QString 変数。しかし、printf を何度見返しても、必ず何かを忘れてしまいます。それで、楽しみのために、今度は一緒に解読して、その過程で最初の小さなコードを作成しましょう 「printf プライマー」 スタックオーバーフロー用。
コードの中で、この小さな宝石を見つけました。
printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g);
変数 a、b、c、d、e、f、g はどのようにフォーマットされるのでしょうか?
解決
ダニーはほとんど正しいです。
a.符号なし 10 進数、最小 4 文字、スペース埋め込み
b.浮動小数点、小数点の前に少なくとも 16 桁 (0 が埋め込まれます)、小数点の後 1 桁
c.16 進数、最小 4 文字、0 埋め込み、文字は大文字で印刷されます
d.上記と同じですが、最低 2 文字です
e.e は int であるとみなされ、unsigned char に変換されて出力されます。
f.eと同じ
g.これはおそらくタイプミスです。4 は効果がありません。「%.4s」の場合、文字列から最大 4 文字が出力されます。この場合、文字列を null で終了する必要がないことに注意してください。
他のヒント
@ジェイソン・デイ, 最後の %4s の 4 は、文字数が 4 文字未満の場合に意味があると思います。4 文字以上ある場合は、正しいです。%4s と %s は同じになりますが、g の文字数が 4 文字未満の場合、4 文字フィールドでは %s は左揃えになり、%4s は右揃えになります。
b は実際には、小数点と小数点以下の 1 桁を含むフィールド全体で最小 16 文字です (合計 16 文字 vs 合計 18 文字)
これが私のprintf入門書です。http://www.pixelbeat.org/programming/gcc/format_specs.html
私は常に-WallでGCCを使用してコンパイルします。これは、付属のprintf形式と変数の間の不一致について警告します。
@jj33、両方の点であなたの言うことは完全に正しいです。
#include <stdio.h>
int main(int argc, char *argv[]) {
char *s = "Hello, World";
char *s2 = "he";
printf("4s: '%4s'\n", s);
printf(".4s: '%.4s'\n", s);
printf("4s2: '%4s'\n", s2);
printf(".4s2: '%.4s'\n", s2);
return 0;
}
$ gcc -o foo foo.c
$ ./foo
4s: 'Hello, World'
.4s: 'Hell'
4s2: ' he'
.4s2: 'he'
よく釣れました!
a.10 進数、有効数字 4 桁
b.わからない
c.16 進数、最小 4 文字
d.16 進数、最低 2 文字
e.1文字
f.文字列、最小 4
本当に必要なのは、printf() ステートメント内のフォーマット文字列を取得し、それらを同等の QString ベースの関数呼び出しに変換するツールです。
フリー ソフトウェアの寄付時間をそのようなツールの開発に費やしたい人はいますか?
このようなツールのソース コードを保持するフリー ソフトウェア ホスティング サービスへの URL のプレースホルダー