質問

私は 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 で終了する必要がないことに注意してください。

編集: jj33 上記の b と g の 2 つの間違いを指摘します ここ.

他のヒント

@ジェイソン・デイ, 最後の %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 のプレースホルダー

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top