将双精度数转换为字符串C++?

27

可能是重复问题:
如何在C++中将double转换为字符串?

我想要将一个字符串和一个double类型的变量组合在一起,但是g++报错了:

main.cpp: 在函数 ‘int main()’ 中:
main.cpp:40: 错误:将类型为 ‘const char [2]’ 和 ‘double’ 的操作数无效地用于二元运算符‘+’

出错的代码行为:

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

这里,storedCorrect[]是一个字符串数组,而c1和c2都是双精度浮点型。是否有办法将c1和c2转换为字符串以使我的程序能够正确编译运行?


11
以下是一些例子,您觉得如何:http://www.codeproject.com/KB/recipes/Tokenizer.aspx 它们非常高效并且有些优雅。 - Matthieu N.
https://dev59.com/Jl4b5IYBdhLWcg3wZwy3 - Shannon Matthews
5个回答

72

你不能直接这样做。有几种方法可以实现:

  1. 使用std::stringstream

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

  4. char buffer[256];  // make sure this is big enough!!!
    snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2);
    storedCorrect[count] = buffer;
    
    有许多其他方法可以使用各种双精度转字符串函数来实现,但这些是您将看到的主要方法。

6
我知道这个答案有点老了,但您可能也想在这里加上 std::string to_string( double ); - JohnJohn

27

在C++11中,如果您可以接受默认格式(%f),则使用 std::to_string

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

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语言风格字符串。


实际上, boost::lexical_cast 在底层并不使用 std::stringstream 。它实现了自己的转换例程,比使用 stringstream 快得多,在大多数情况下比 scanf/printf 更快。参见:http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/performance.html - Ferruccio
lexical_cast的源代码与我上一次见到它时有很大的不同。在过去几个Boost版本中,性能显著提高。如果可以的话,这更是采用它的原因。 - Michael Kristofik

10

1

8
sprintf 在数字格式化时存在安全问题,因为它没有对输出缓冲区进行任何边界检查,并且没有好的可移植方法可以确定在任何 double 值上都安全的缓冲区大小。 - Pavel Minaev
那么,在这种情况下,使用 snprintf :) 但是,确实很难预测所需的缓冲区大小。 - tomsmeding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接