2012-01-05 10 views
3

私は、さまざまな理由でsprintfを使用して、std::stringオブジェクトの結果に興味があります。私が思いついたほとんどの構文的に直接的な方法は次のとおりです。sprintfをstd :: stringに直接変換しますか?

char* buf; 
sprintf(buf, ...); 
std::string s(buf); 

他のアイデア?

+3

あなたのコードがそのままバッファオーバーフローの原因になっていることはご存じですか?それとも、現在使用しているコードの真のバグですか? –

+0

[std :: string formatting sprintfの可能な複製](http://stackoverflow.com/questions/2342162/stdstring-formatting-like-sprintf) –

答えて

7

printf関数の行をC++の書式設定に使用しないでください。型安全なストリーム(この場合は文字列ストリーム)の言語機能を使用し、特殊な書式文字をユーザーに提供する必要はありません。

あなたは本当にはあなたの文字列では、あなたが事前に割り当てることができると十分なスペースを行い、その後、私はそれが一時的な文字バッファアレイを使用するよりも効率的だかはわからないが、それをダウンサイズを変更したい場合:

std::string foo; 
foo.resize(max_length); 
int num_bytes = snprintf(&foo[0], max_length, ...); 
if(num_bytes < max_length) 
{ 
    foo.resize(num_bytes); 
} 
+1

'basic_string'の要素が保証されていないと聞いたと思いますこのように '&foo [0]'を使うことは、技術的には未定義の動作になります。私も考えています*これはC++ 11で変更されたと聞きましたが、わかりません。 –

+4

@Benjamin:C++ 03 properは 'std :: basic_string <>'の連続した記憶域を必要としませんが、[library issue 530](http://www.open-std.org/jtc1/sc22/wg21/docs) /lwg-defects.html#530)はそれを必要としており、私が認識しているすべてのコンパイラベンダーは何年もこれを守っています。また、C++ 11が必要とすることは間違いありません。 – ildjarn

+0

'max_length'は終端のヌルバイトをカウントしますか?私は 'basic_string'がヌル終端を使わないことを一度聞いたと思います。 – Hendrik

1

もしsprintfを使用したい場合は、あなたが書いたものより直接的な方法はありません。

sprintfのは、あなたがstd::stringにこのC stringを変換したい場合は、あなたが書いたものよりは良い、より安全な方法はありませんC文字列strの

が指す配列に書き込みます。

+1

ほとんどすべてのシステムで 'snprintf'が利用できるときは、' sprintf'を推奨しません(C++ストリームはオプションではないと仮定します)。 –

0

回答者here必要なバッファの長さを取得するには、呼び出し:リンクされstackoverflowの答えで

std::string s = string_sprintf("%g, %g\n", 1.23, 0.001); 

例:

snprintf(nullptr, 0, format, args...) 

あなたはそのように使用することができ、短い関数を書くことができます。