2017-08-10 6 views
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); 
+0

*「オリジナルの利便性」* - それは非常に議論の余地があります。 – StoryTeller

+0

技術的には正しいと思われますが、バッファーが128サイズの上限を超えている場合はあまり効果がありません。それはvsnprintfを再び呼び出して、関数の長さを2倍にします。ここでは、利便性とパフォーマンスのバランスをとる必要があります。さらに、返された文字列は再びコピーされ、パフォーマンスにさらに影響します。 – Freakyy

+0

戻り値には移動セマンティクスがあるため、別のコピーは存在しません。 – CplusPuzzle

答えて

0

は、すでに多くの議論はここで、この上があることが判明:

std::string formatting like sprintf

主観的には、私のバージョンはまだほとんどのものよりもより簡潔に見えますが、それは機能的ですこのスレッドで提案されているソリューションの一部と同じです。

関連する問題