我有一个简单的问题,我想我只是做了一些导致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));
非常感谢任何帮助。如果任何一种方法的效果都很棒,但是我并不是真的很担心怎么做,只要我能用一个字符串得到一个双倍的猫!
答案 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*
,因为这是放置结果的缓冲区。你不能把它放在那个字符串文字中,因为:
第二个参数不需要强制转换,因为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*
。