为什么gtk +在eclipse上调试时会说“无效的utf-8”?

时间:2012-06-11 20:14:58

标签: windows eclipse debugging utf-8 gtk

我一直在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,而单词是设置为“a,b,c,d”的char *参数。我在使用gtk + 2.24的minGW编译器通过eclipse在windows xp上运行它。谁能告诉我如何调试/解决这个问题?

PS。 's'包含来自文件的文本,后跟一个或十二个空字符(如果我运行,则为一个,如果我调试则为12个)

2 个答案:

答案 0 :(得分:4)

鉴于你提供的代码,这一行是问题:

strcat(answerBuffer,words);

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

答案 1 :(得分:0)

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

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

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