2

我一直在 Eclipse 中创建一个 gtk+ 应用程序。在代码中的某处,使用类似于 gtk+ hello world 的代码显示警告对话框。当我运行这个程序时,对话最终会按预期显示“单词”的内容,但是当我关闭对话时程序崩溃了。我是c新手,所以我用调试运行程序,希望能找到一些简单的错误。但是,当我运行调试时,对话框显示前面有许多空字符的“单词”并记录了该消息。

Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

这个新问题令人困惑,更令人困惑的是,当对话关闭时,程序也没有崩溃。

综上所述,我运行代码的时候,文字没问题,程序崩溃了。当我调试代码时,文本无效,程序没有崩溃。

对话中的文本是使用以下代码生成的:

char*  answerBuffer = (char*)malloc(strlen(s)+strlen(words)+1);

strcat(answerBuffer,words);

char*  answer = (char*)malloc(strlen(answerBuffer)+1);
g_strlcpy(answer,answerBuffer,strlen(answerBuffer)+1);

return answer;

在代码执行时,answerBuffer 的长度为 320,words 是一个设置为“a,b,c,d”的 char* 参数。我正在使用 gtk+ 2.24 的 minGW 编译器通过 eclipse 在 windows xp 上运行它。谁能告诉我如何调试/修复这个?

附言。's' 包含文件中的文本,后跟一个或十二个空字符(如果我运行一个,如果我调试十二个)

4

2 回答 2

4

鉴于您提供的代码,这一行就是问题所在:

strcat(answerBuffer,words);

为什么?因为你不知道里面有什么answerBuffer。Malloc 返回给您的内存不一定为零,因此answerBuffer基本上包含随机字节。您至少需要将第一个字节归零(因此它看起来像一个零长度的字符串),或者用于calloc()分配您的缓冲区,这将为您提供归零的内存。

于 2012-06-12T01:48:01.350 回答
0

好吧,'s' 的内容很可能不是有效的 UTF-8 序列。

查找 UTF-8 的含义以防让您感到困惑。或者为了简单起见,确保您的文本文件仅包含 ASCII 字符。

如果这对您没有帮助,那么您可能在某个地方弄乱了文件读取或可能的编码转换。

于 2012-06-11T23:51:46.223 回答