私は C++ に比較的慣れていないので、まだ C++ 標準ライブラリを理解しています。std::string
C からの移行を支援するために、 printf スタイルのフォーマッターを使用してa をフォーマットしたいと考えています。私stringstream
はよりタイプセーフなアプローチであることを理解していますが、printfスタイルの方が読みやすく、扱いやすいと感じています(少なくとも当分の間)。これは私の機能です:
using namespace std;
string formatStdString(const string &format, ...)
{
va_list va;
string output;
size_t needed;
size_t used;
va_start(va, format);
needed = vsnprintf(&output[0], 0, format.c_str(), va);
output.resize(needed + 1); // for null terminator??
va_end(va);
va_start(va, format);
used = vsnprintf(&output[0], output.capacity(), format.c_str(), va);
// assert(used == needed);
va_end(va);
return output;
}
これはうまくいきます。私がよくわからないいくつかのことは次のとおりです。
- null ターミネータ用のスペースを確保する必要がありますか、それとも不要ですか?
capacity()
ここで呼び出す関数は正しいですか? 文字length()
列の最初の文字が'\0'
.
この文字列の内容をソケットに書き込んでいるときに (および を使用しc_str()
てlength()
)、受信側で null バイトがポップアップすることがあります。この関数をまったく使用しない場合、null バイトは表示されません。