1

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

我只是想将双变量转换为字符串,然后将它们“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));

任何帮助是极大的赞赏。如果任何一种方法都有效,那将是很棒的,但我并不真正关心如何去做,只要我能用字符串得到一个双倍的 cat !

4

2 回答 2

8

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

让我们看一下strcat签名

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

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

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

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

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

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());

由于代码已经在使用 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());
于 2012-08-07T17:13:07.067 回答
1

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

const char* fps_target_string = (const char*) boost::lexical_cast<std::string>(fps_target)不会编译,因为没有从 std::string 到const char*.

于 2012-08-07T17:13:47.883 回答