2012-02-04 11 views
0

C++クロスプラットフォーム(C99、C++ 0x independent)snprintfで実装が可能かどうかと思いますか?そのようなブーストにはありますか? (私はsnprintf(4)を交換するC++のイディオムであるものについて疑問に思う?)C++クロスプラットフォームsnprintfでの実装方法は?

+1

C++イディオムは 'std :: stringstream'を使用しています。 –

答えて

6

std::ostringstreamsnprintfを使用するalterntive次のようになります。boost::lexical_castもあり

#include <sstream> 

std::ostringstream s; 
s << 4 << "hello"; 
// s.str().c_str(); // This returns `const char*` to constructed string. 

char buf[1024]; 
snprintf(buf, 1024, "%d%s", 4, "hello"); 

は等価

std::string s = boost::lexical_cast<std::string>(4) + 
        boost::lexical_cast<std::string>("hello"); 
1

Y ouはQt QString classを見たいと思うかもしれません。これは、非常にOOのような方法であなたが望むことを行うフォーマット機能を提供します。あなたは確かにそこからコピーして学ぶことができます。

はい、タグ付きブーストであった質問でQtに言及するのはタブーになるかもしれませんが、その質問はそれよりも一般的なようでした。

2

はい、フォーマット文字列をサポートするBoost Formatライブラリがあります。

1

Boostが言及されて以来、Boost.Formatに問題はありますか?

0

Windows/Linux/HP-UXでsnprintfが必要でした。私はsnprintf_safeを定義し、Linux/HP-UXではsnprinfを使用し、Windowsでは_snprintfを使用しました。 _snprintfには、データを格納するために必要なバイト数が最大許容サイズを超えている場合、 '\ 0'を書き込むアプローチが少し異なります。だからそれを処理する必要があった。代替として動作しますが、あなたは余分なコピーすることなく、より良いパフォーマンス・ソリューションを必要とするか、またはCがないC++あなたがかもしれないだけ持ってない場合

#ifdef #WIN32 
int snprintf_safe() 
{ 
    // make use of _snprintf 
} 
#else 
    #define snprintf_safe snprintf 
#endif 
0

std::ostringstreamまたはstd::to_string(++ 11 C):とにかく、それはマクロのこのようなものでした

MSVCはC99をサポートしていないため、snprintf機能は持っていませんが、セルフメイドのものは _snprintfです。

戻り値:

  • MSVC:-1を返します(ヌル終端を含まないすべてのものを書くことは、バッファサイズは十分ではない場合MSVCS _snprintfと公式C99(GCC、打ち鳴らす)snprintf

    違い!)

  • GCC:

    • MSVC::、できるだけ多くの書き込みがない場合は末尾にNULLを書いていないバッファが

    十分に大きく書かれたバイトあれば書かれていたであろう文字の戻り数常にNULLを終了書き、できるだけ多くの書き込み(例外:BUFFER_SIZE = 0)

興味深いスペースが

  • GCCを残しました微妙: コードに%nを使用すると、MSVCはそれをユニット化したままにします!バッファサイズが小さいために解析が中断された場合、GCCはbufferが十分に大きい場合に書き込まれるバイト数を常に書き込みます。

    だから私の提案は、同じ戻り値を与え、両方のプラットフォームで同じバイトを書き込みvsnprintf/_vsnprintfを使用して、独自のラッパー関数mysnprintfを書くことになります(注意してください:%nは修正するのがより困難です)。

  • 関連する問題