将double转换为字符串C++? [复制]
Posted
技术标签:
【中文标题】将double转换为字符串C++? [复制]【英文标题】:Convert double to string C++? [duplicate] 【发布时间】:2009-07-14 02:44:59 【问题描述】:可能重复:How do I convert a double into a string in C++?
我想组合一个字符串和一个双精度,而 g++ 抛出这个错误:
main.cpp:在函数“int main()”中: main.cpp:40: 错误:“const char [2]”和“double”类型的无效操作数到二进制“operator+”
这是引发错误的代码行:
存储正确[count] = "("+c1+","+c2+")";storedCorrect[] 是一个字符串数组,c1 和 c2 都是双精度数。有没有办法将 c1 和 c2 转换为字符串以使我的程序能够正确编译?
【问题讨论】:
下面的一些例子怎么样:codeproject.com/KB/recipes/Tokenizer.aspx 它们非常高效而且有点优雅。 ***.com/q/29200635/395461 【参考方案1】:你不能直接做。有很多方法可以做到:
使用std::stringstream
:
std::ostringstream s;
s << "(" << c1 << ", " << c2 << ")";
storedCorrect[count] = s.str()
使用boost::lexical_cast
:
storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")";
使用std::snprintf
:
char buffer[256]; // make sure this is big enough!!!
snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2);
storedCorrect[count] = buffer;
还有许多其他方法,使用各种双字符串转换函数,但这些是您将看到它完成的主要方法。
【讨论】:
我知道这个答案很旧,但您可能还想在此处包含std::string to_string( double );
。【参考方案2】:
在 C++11 中,use std::to_string
如果您可以接受默认格式 (%f
)。
storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";
【讨论】:
【参考方案3】:使用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 风格的字符串。
【讨论】:
实际上,boost::lexical_cast
并没有在后台使用std::stringstream
。它实现了自己的转换例程,比使用stringstream
快得多,并且在大多数情况下比scanf
/printf
快。见:boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/…
lexical_cast
的来源与我上次看到时大不相同。在过去的几个 Boost 版本中,它们似乎已经大大提高了性能。如果可以的话,这就是更多的理由。【参考方案4】:
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
【讨论】:
【参考方案5】:我相信 sprintf 是适合您的功能。我在标准库中,比如 printf。点击以下链接了解更多信息:
http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
【讨论】:
sprintf
对数字格式不安全,因为它不对输出缓冲区进行任何边界检查,并且没有好的可移植方法来确定对任何人都安全的缓冲区大小double
值。
在这种情况下,使用snprintf
:) 但实际上,预测所需的缓冲区大小可能很困难。以上是关于将double转换为字符串C++? [复制]的主要内容,如果未能解决你的问题,请参考以下文章