2

一部の snprintf 呼び出しを文字列ストリームに置き換えようとしています。出力が同一であることを確認する必要があります。

与えられたlong l = some_input_var;

行う

std::ostringstream str;
str << l;
return str.str();

buf str[24];
snprintf(str, 24, "%ld", l);
return std::string(str);

同一の文字列を返しますか?

int"%d"または doubleとはどう"%f"ですか?

4

3 に答える 3

2

はい。しかし、それは長い話です。iostreams のフォーマットは、ストリームのコーデックのフォーマット ファセットを介して機能します。詳細はかなり複雑です。C++11 27.7 を参照してください。デフォルトのファセットの変換ではsprintf、入力の書式設定に使用されstrtoull、出力には -type 関数が使用されます。詳細については、22.4.2.1 を参照してください。

また、同様に、新しい<string>変換関数std::to_stringはデフォルトのsprintf形式を使用し、さまざまstd::stoulな に似た関数は C ライブラリの に似た関数を使用しstrtoulます。

于 2012-10-11T16:21:04.283 に答える
1

標準では、C++ の書式設定は printf 書式指定子の観点から定義されているため、単純なフォーマッタが同じように機能することはほぼ確実です。ただし、iostream がサポートしていないもの (およびその逆) があります。"% d"たとえば、 に相当する iostream はなく、文字列を出力するときに精度の指定が無視されます (おそらく、iostream は文字列がフォーマット文字列の一部、または ) に対応し"%s"ます。

また、幅を除くすべての形式オプションが固定であることを忘れないでください。それらを保存し、それらを必要とする要素をフォーマットしたときにそれらを復元する必要があります。

于 2012-10-11T16:24:36.577 に答える
0

その場合の答えはイエスであるとしましょう。すべてのケースで同じであるとは信じられません。特に、すべてのアライメントを正しく行うという苦労があります。

Boost::formatを検討しましたか?

のようなものreturn boost::str(boost::format("%ld") % l);が機能するはずであり、より簡単な移行パスを提供します。違いはありますが。

于 2012-10-11T16:11:54.383 に答える