我有一个简单的问题,我认为我只是在做一些导致 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*
因为这是将要放置结果的缓冲区。你不能把它放在那个字符串文字中,因为:
- 字符串文字是只读的;
- 该字符串文字不够大。
第二个参数不需要转换,因为 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/