web-dev-qa-db-ja.com

doubleを文字列C ++に変換しますか?

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

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

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

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

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

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

27
Mentalikryst

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

  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-to-string変換関数を使用する方法は他にもたくさんありますが、これらが主な方法です。

72
Adam Rosenfield

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

storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";
27
kennytm

_std::stringstream_ を使用します。その_operator <<_は、すべての組み込み型に対してオーバーロードされます。

_#include <sstream>    

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

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

また、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ライブラリを使用する主な利点は、他の方法(たとえば、stringからdouble)を簡単に使用できることです。 atof()またはstrtod()と生のCスタイル文字列をいじる必要はもうありません。

23
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

10
aJ.

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

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

1
mp.