0

それが可能かどうか、また C++ クロスプラットフォーム (C99、C++0x に依存しない) で実装する方法はsnprintf? ブーストにそのようなものはありますか?(C++ のイディオムは何に置き換えるのsnprintf(4)だろうか?)

4

6 に答える 6

6

std::ostringstreamを使用する代わりになりますsnprintf

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

同等:

#include <sstream>

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

boost::lexical_castもあります:

std::string s = boost::lexical_cast<std::string>(4) +
                    boost::lexical_cast<std::string>("hello");
于 2012-02-04T16:01:19.027 に答える
2

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

于 2012-02-04T16:04:18.963 に答える
1

Boostが言及されたので、Boost.Formatに何か問題がありますか?

于 2012-02-04T16:05:34.313 に答える
1

Qt QString classを見たいと思うかもしれません。これは、非常にオブジェクト指向の方法で必要なことを行うフォーマット関数を提供します。あなたは確かにそれをコピーして学ぶことができます.

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

于 2012-02-04T16:01:24.567 に答える
0

snprintfWindows/Linux/HP-UX で必要になったら。を定義snprintf_safeし、Linux/HP-UX では を使用しsnprinf、Windows では を使用し_snprintfました。_snprintfデータを格納するために必要なバイト数が最大許容サイズを超える場合、'\0' を書き込む方法が少し異なることを覚えています。だから対処する必要がありました。とにかく、それはこの種のマクロでした:

#ifdef #WIN32
int snprintf_safe()
{
  // make use of _snprintf
}
#else
   #define snprintf_safe snprintf
#endif
于 2012-02-04T16:19:43.783 に答える
0

std::ostringstreamまたはstd::to_string(c++11) は代替手段として機能しますが、追加のコピーを使用せずにパフォーマンスを向上させるソリューションが必要な場合、または C++ ではなく C のみを使用する場合は、別のことを行う必要がある場合があります。

MSVC は C99 をサポートしていないため、snprintf機能はなく、自作の _snprintf.

_snprintfMSVCと公式 C99 (gcc,clang)の違いsnprintf:

戻り値:

  • MSVC: バッファー サイズがすべてを書き込むのに十分でない場合は -1 を返します (終端の null を含まない!)
  • GCC: バッファが十分に大きい場合に書き込まれる文字数を返す

書き込まれたバイト:

  • MSVC: できる限り書き込みます。スペースが残っていない場合は最後に NULL を書き込まないでください。
  • GCC: 可能な限り書き込み、常に終了 NULL を書き込みます (例外: buffer_size=0)

興味深い%n微妙な点:%nコードで を使用すると、MSVC はそれを初期化したままにします! バッファサイズが小さすぎるために解析が停止した場合、GCC は、バッファが十分に大きかった場合に書き込まれるバイト数を常に書き込みます。

したがって、私の提案は、/をmysnprintf使用して独自のラッパー関数を作成することです。これにより、両方のプラットフォームで同じ戻り値が得られ、同じバイトが書き込まれます (注意:修正がより困難です)。vsnprintf_vsnprintf%n

于 2014-02-21T08:55:31.050 に答える