27

重複の可能性:
C++ で double を文字列に変換するにはどうすればよいですか?

文字列と double を結合したいのですが、g++ がこのエラーをスローしています:

main.cpp: 関数 'int main()' 内:
main.cpp:40: エラー: タイプ 'const char [2]' および 'double' からバイナリ 'operator+' への無効なオペランド</p>

エラーをスローしているコード行は次のとおりです。

storedCorrect[count] = "("+c1+","+c2+")";

storedCorrect[] は文字列配列で、c1 と c2 は両方とも double です。プログラムを正しくコンパイルできるように、c1 と c2 を文字列に変換する方法はありますか?

4

5 に答える 5

72

直接行うことはできません。それにはいくつかの方法があります。

  1. 次を使用しstd::stringstreamます。

    std::ostringstream s;
    s << "(" << c1 << ", " << c2 << ")";
    storedCorrect[count] = s.str()
    
  2. 使用boost::lexical_cast:

    storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")";
    
  3. 使用std::snprintf:

    char buffer[256];  // make sure this is big enough!!!
    snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2);
    storedCorrect[count] = buffer;
    

さまざまな double から string への変換関数を使用する方法は他にも多数ありますが、主な方法は次のとおりです。

于 2009-07-14T02:52:20.830 に答える
27

C++11 では、デフォルトの形式 ( ) を受け入れることができる場合に使用std::to_string%fします。

storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";
于 2011-12-09T10:09:41.670 に答える
23

を使用しstd::stringstreamます。すべてoperator <<の組み込み型に対してオーバーロードされています。

#include <sstream>    

std::stringstream s;
s << "(" << c1 << "," << c2 << ")";
storedCorrect[count] = s.str();

これは期待どおりに機能します - で画面に出力するのと同じ方法ですstd::cout。代わりに、単に文字列に「印刷」しています。の内部は、operator <<十分なスペースがあることを確認し、必要な変換 (たとえば、doublestring) を実行します。

また、Boost ライブラリを利用できる場合は、調べることを検討してくださいlexical_cast。構文は、通常の C++ スタイルのキャストによく似ています。

#include <string>
#include <boost/lexical_cast.hpp>
using namespace boost;

storedCorrect[count] = "(" + lexical_cast<std::string>(c1) +
                       "," + lexical_cast<std::string>(c2) + ")";

内部でboost::lexical_castは、基本的に で行ったのと同じことを行っていstd::stringstreamます。Boost ライブラリを使用する主な利点は、別の方法 (例:stringdouble) にも同じように簡単に移動できることです。atof()またはstrtod()生の C スタイルの文字列をいじる必要はもうありません。

于 2009-07-14T02:50:46.150 に答える
10
std::string stringify(double x)
 {
   std::ostringstream o;
   if (!(o << x))
     throw BadConversion("stringify(double)");
   return o.str();
 }

C++ FAQ: http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

于 2009-07-14T02:50:44.153 に答える
1

sprintf はあなたにぴったりの機能だと思います。私はprintfのような標準ライブラリにいます。詳細については、次のリンクを参照してください。

http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

于 2009-07-14T02:52:47.363 に答える