c++ - 将 double 转换为字符串。 Boost 库似乎不起作用,sstream 导致 "SEG FAULT"

标签 c++ boost casting double lexical

我有一个简单的问题,我认为我只是在做一些导致 SEGFAULT 的愚蠢事情。

我只是想将 double 变量转换为字符串,然后将它们“strcat()”在一起,并将生成的串联字符串放入 GTK 标签中。 (应该很简单吧?!)

这是我的代码的一部分:

double fps_target = 2.71828
std::string fps_target_string;
std::stringstream convert;
convert << fps_target;
fps_target_string = convert.str();
g_print("seg fault occurs below");
label_fps_target = gtk_label_new(strcat("FPS Target: ", 
    (const char*) fps_target_string.c_str()));

为什么它不能工作?! :(

我尝试使用 Boost::Lexical_Cast 的东西,但是没有用:

double fps_target = 3.14159;
const char* fps_target_string = (const char*) (boost::lexical_cast<std::string>(fps_target));

非常感谢任何帮助。如果这两种方法都能奏效,那就太棒了,但我并不真正在意如何去做,只要我能用字符串得到一个 double to cat 即可!

最佳答案

它甚至不应该编译。确保将编译器的警告和一致性级别设置为高。从长远来看,这将为您省去很多麻烦。

让我们看看strcat's signature :

char *strcat( char *dest, const char *src );

因此,它采用 char* 作为第一个参数。但是 "FPS Target: " 的类型 char const[13] 会衰减为 char const*,不能作为 传递字符*char* 允许修改,但 char const* 不允许(字符串文字不可变!)。第一个参数是 char* 因为这是将要放置结果的缓冲区。你不能把它放在那个字符串文字中,因为:

  1. 字符串文字是只读的;
  2. 该字符串文字不够大。

第二个参数不需要转换,因为 c_str() 的返回类型已经是 char const*

连接字符串的最简单方法是使用 std::string 而不必费心使用 C 库字符串操作函数。

std::string result = "FPS Target: " + fps_target_string;
g_print("seg fault doesn't occur below");
label_fps_target = gtk_label_new(result.c_str());

由于代码已经在使用 stringstream,因此更简单的方法是将两个部分都插入到流中。

std::stringstream convert;
convert << "FPS Target: " << fps_target;
std::string result = convert.str();
g_print("seg fault doesn't occur below");
label_fps_target = gtk_label_new(result.c_str());

关于c++ - 将 double 转换为字符串。 Boost 库似乎不起作用,sstream 导致 "SEG FAULT",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11850766/

相关文章:

c++ - Visual C++ 编译器 2012 年 11 月 CTP 与 Qt Creator for C++11

c++ - 为什么当我尝试对一个数字加一个矩阵求和时运算符重载失败? (但它的工作方式相反)

C++ boost共享数组交换指针(简单问题)

C++:为什么boost::ptr_vector resize需要对象具有默认构造函数

c++ - 以隐式方式在不同类型之间进行类型转换

c# - 与对象类型一起使用

c# - 将数组转换为 IEnumerable<T>

c++ - Visual Studio 2013 Express - 如何添加资源?

c++ - STL max_element 未使用我的类中的重载运算符 operator<

c++ - 后期不可复制成员初始化