将double转换为字符串.Boost Libraries似乎不起作用,sstream导致"SEG FAULT"

use*_*501 1 c++ double boost casting lexical

我有一个简单的问题,我想我只是在做一些导致SEGFAULT的愚蠢行为.

我只是想将一个double变量转换为一个字符串,然后将'strcat()'转换为一起,并将生成的连接字符串放在GTK Label中.(应该很简单,当然?!)

这是我的代码的一部分:

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()));
Run Code Online (Sandbox Code Playgroud)

为什么不能工作?!:(

我尝试使用Boost :: Lexical_Cast的东西,但这不起作用:

double fps_target = 3.14159;
const char* fps_target_string = (const char*) (boost::lexical_cast<std::string>(fps_target));
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.如果任何一种方法的效果都很棒,但我并不是真的很担心怎么做,只要我能用一个字符串得到一个双倍的猫!

R. *_*des 8

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

让我们来看看strcat签名:

char *strcat( char *dest, const char *src );
Run Code Online (Sandbox Code Playgroud)

因此,它需要char*第一个参数.但是"FPS Target: "char const[13]衰变的类型,char const*不能作为一个传递char*.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());
Run Code Online (Sandbox Code Playgroud)

由于代码已经使用了a 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());
Run Code Online (Sandbox Code Playgroud)