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

时间:2012-08-07 17:04:48

标签: c++ boost casting double 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()));

为什么它不起作用?! :(

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

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

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

2 个答案:

答案 0 :(得分:8)

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

让我们看一下strcat's signature

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

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

  1. 字符串文字是只读的;
  2. 字符串文字不够大。
  3. 第二个参数不需要强制转换,因为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());
    

答案 1 :(得分:1)

strcat()使用第一个参数作为输出缓冲区。当然,strcat("FPS Target: "...)会崩溃。分配缓冲区并将其作为第一个参数传递。

const char* fps_target_string = (const char*) boost::lexical_cast<std::string>(fps_target)无法编译,因为没有从std :: string转换为const char*