7

私のコード (C++ ではなく厳密な C) では、vsnprintf を次のように使用します。

char* buf = NULL;
size_t sz;
sz = vsnprintf( buf, 0, format, args); // Ask vsnprintf how big a buffer we need

buf = (char*) malloc(sz + 1);
vsnprintf( buf, sz, format, args); // Now actually fill the buffer
/* Use buf in a dialog box... then: */
free(buf);

ただし、MS Visual C++ (MSVS10) コンパイラは次のように警告します。

warning C4996: 'vsnprintf': This function or variable may be unsafe. Consider using vsnprintf_s instead. 

ただし、バッファに NULL を渡すと、出力されるデータの量が記述されるという気の利いた機能はありvsnprintf_sませ。代わりに、-1 を返すように文書化されています。

vsnprintf必要なサイズを判断することで安全に使用できていると感じており、推奨される交換vsnprintf_sはまったく同じではありません.

より良い/よりスマートな使用方法がありませんvsnprintf_sか??

4

4 に答える 4

4

この質問は、次のものとほとんど同じであることがわかります。

sprintf() バッファーのサイズの計算

答えの要約:

を使用_vscprintfして、バッファーの大きさを把握し、次に を使用vsnprintf_sして実際にバッファーを埋めます。

于 2013-06-28T18:23:55.337 に答える
0

@abelenkyが示唆しているように、これは重複した質問だとは言いません。vsnzprintf_sold の代わりに使用する場合は、引数 (3 番目のパラメーター)として(これは に展開されます)vsnprintfを渡す必要があります。_TRUNCATE((size_t)-1)count

https://msdn.microsoft.com/en-us/library/d3xd30zz.aspx

データを格納するために必要なストレージと終端の null が sizeOfBuffer を超える場合、count が _TRUNCATE でない限り、パラメーターの検証で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 1 が返されました。無効なパラメーター ハンドラーの後に実行が続く場合、これらの関数はバッファーを空の文字列に設定し、errno を ERANGE に設定して、-1 を返します。

于 2018-05-24T05:52:36.080 に答える