2

文字列をフォーマットするために sprintf 関数を呼び出すと、予期しないものが出力されました

printf("%d;%s;%s;%d;%d;\n", ptr->programmaType, ptr->titel, ptr->zender, ptr->start, ptr->einde);

「0;Stargate;scifi;0;0;」を出力します その間

printf("%d;", ptr->einde);

ptr->einde の値である "42" を出力します。私も試してみました

printf("%d;%s;%s;%d;%d;", 0, "Stargate", "scifi", 0, 42);

これは正しく印刷されるので、問題は変数に関連していると思います。最後に試したのは

int bug = ptr->einde;
printf("%d;%s;%s;%d;%d;\n", ptr->programmaType, ptr->titel, ptr->zender, ptr->start, bug);

これも正しく印刷できませんでした...何が起こっているのかわかりません。

注: ptr->start および ptr->einde は time_t 型として定義されていますが、printf が単一の引数で動作することを確認すると、それが問題であるとは思えません。

4

3 に答える 3

8

あなたはそれを言って、ptr->startタイプです。この型は完全には移植可能ではなく、任意の「整数型または実数浮動小数点型」になる可能性があるため、型として出力しようとすると、システムで正しく処理されない可能性があります。ptr->eindetime_tint

既知のものにキャストしてから印刷してみてください:

printf("%d;%s;%s;%ld;%ld;\n", ptr->programmaType, ptr->titel, 
    ptr->zender, (long)ptr->start, (long)ptr->einde);
于 2013-03-05T12:33:23.473 に答える
1

の定義は typeでptr->eindeないと思いますint

そして、値を期待する指定子で使用"%d"しています。 正しい型と printf の動作に対して正しい指定子を使用してください。printfint

于 2013-03-05T12:30:32.073 に答える
0

Noprintfは、少なくとも 4095 文字を出力できなければならない組み込み実装を除いて、長さに制限はありません。

time_tおそらく64ビットの整数値です。解決策は、変数をフォーマット指定子にキャストし(uint64_t)て使用することです。PRIu64

printf("%d;%s;%s;%"PRIu64";%"PRIu64";\n", 
           ptr->programmaType, 
           ptr->titel, ptr->zender, 
           (uint64_t)ptr->start, 
           (uint64_t)ptr->einde);
于 2013-03-05T12:38:52.763 に答える