2

vsnprintf()ユーザーにエラーをトリガーすることなく、入力バッファーよりも長くなる可能性のあるバッファーを使用して、いくつかのバリアントを使用する方法を探しています。

これまでのところvsnprintf()、バッファーが小さすぎると文字列が静かに切り捨てられることがわかりましたが、文字列の実際の長さは返されないため、より長いバッファーで再試行することはできません。-1 を返します。

一方、vsnprintf_s()バリアントは、このエラーに直面すると、

_VALIDATE_RETURN(("Buffer too small", 0), ERANGE, -1);

_CrtDbgReportW()おそらくデバッグでのみ、最終的に を呼び出します。ユーザーが提供した「無効なパラメーターハンドラー」を呼び出す前であっても、これを行います。

私が望むのは、割り当てる必要がある実際のサイズを取得して関数を再度呼び出すことにより、ユーザーの操作なしで回復できることだけです。それは可能ですか?

4

2 に答える 2

2

探している関数は _vscprintf (または _vscwprintf) です。これらは、実際には何もフォーマットせずに、必要な文字数を返します。

于 2010-03-24T14:12:04.940 に答える
0

で出力バッファの長さを指定すると、文字数だけが書き込まれたnことがわかります。n

vsnprintfバッファが十分に長い場合に書き込まれる文字数を返します。

したがって、戻り値は必要なバッファのサイズです。

を設定n=0すると、何も書き込まれませんが、vsnprintf必要なバッファの大きさがわかります。

(ドキュメントを読み直したvsnprintfところ、 の戻り値に 1 バイトを追加する必要がありますNUL。)

于 2010-03-24T13:56:01.847 に答える