27

可能重复:
如何在 C++ 中将双精度转换为字符串?

我想组合一个字符串和一个双精度,而 g++ 抛出这个错误:

main.cpp:在函数'int main()'中:
main.cpp:40:错误:'const char [2]'和'double'类型的无效操作数到二进制'operator +'</p>

这是引发错误的代码行:

存储正确[count] = "("+c1+","+c2+")";

storedCorrect[] 是一个字符串数组,c1 和 c2 都是双精度数。有没有办法将 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;
    

还有许多其他方法,使用各种双字符串转换函数,但这些是您将看到它完成的主要方法。

于 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 库的一个关键优势是您可以同样轻松地使用其他方式(例如, stringto )。double不再使用atof()orstrtod()和原始 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++ 常见问题解答: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 回答