4

これは元のコードです。

// ...
unsigned __int64 num = 57;
sprintf_s(buffer, sizeof(buffer), "%llu", num);

ただし、この部分をこの関数に抽出しようとすると:

void addBuffered(void** attributeValue, char* format)
{
    sprintf_s(buffer, sizeof(buffer), format, *attributeValue);
}

呼び出すことによって:

addBuffered((void**)&num, "%d");

正しい値を取得するには、フォーマット パラメータをsprintf_sから%lluに変更する必要があります。%dなぜこれが起こるのか、そしてパラメータの変更が%d問題になる可能性があるかどうかを誰かが説明できますか? ありがとう!

4

3 に答える 3

1

簡単にすることを提案します:

std::ostringstream buffer;

buffer << num;

内部化/カスタマイズには扱いにくい場合がありますが。単純なフォーマットのストリームは非常に単純です...そして安全です。

于 2012-07-05T10:07:28.943 に答える
0

%ptype の値に対応するprintf書式指定子として安全に使用できますvoid *

もちろん、そうは言っても、ここでより安全な実装を検討することもお勧めします。addBuffered関数が可変長でない理由はありますか? 代わりに使用できる可能性がありますvsprintf_s

于 2012-07-05T10:13:17.317 に答える