0
私は、私たちのプロジェクトでsprintf/snprintfの代わりとして以下を提案することを考えています。strprintf - この実装は安全で移植性がありますか?
バッファサイズについて考える必要性を排除し、可能な限りオリジナルの便利さを維持することです。
std::string strprintf(const char *fromat, ...)
{
std::string s;
s.resize(128); // best guess
char *buff = const_cast<char *>(s.data());
va_list arglist;
va_start(arglist, fromat);
auto len = vsnprintf(buff, 128, fromat, arglist);
va_end(arglist);
if (len > 127)
{
va_start(arglist, fromat);
s.resize(len + 1); // leave room for null terminator
buff = const_cast<char *>(s.data());
len = vsnprintf(buff, len+1, fromat, arglist);
va_end(arglist);
}
s.resize(len);
return s; // move semantics FTW
}
このコードには固有の問題がありますか?
使用例:
auto s = strprintf("Hello %d world", 777);
*「オリジナルの利便性」* - それは非常に議論の余地があります。 – StoryTeller
技術的には正しいと思われますが、バッファーが128サイズの上限を超えている場合はあまり効果がありません。それはvsnprintfを再び呼び出して、関数の長さを2倍にします。ここでは、利便性とパフォーマンスのバランスをとる必要があります。さらに、返された文字列は再びコピーされ、パフォーマンスにさらに影響します。 – Freakyy
戻り値には移動セマンティクスがあるため、別のコピーは存在しません。 – CplusPuzzle