我一直在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个)
答案 0 :(得分:4)
鉴于你提供的代码,这一行是问题:
strcat(answerBuffer,words);
为什么呢?因为你不知道answerBuffer
中的内容。 Malloc不一定归零给你,因此answerBuffer
基本上包含随机字节。您需要至少将第一个字节归零(因此它看起来像一个零长度字符串),或者使用calloc()
来分配缓冲区,从而为您提供归零内存。
答案 1 :(得分:0)
嗯,很可能是's'的内容不是有效的UTF-8序列。
查看UTF-8的内容,以免让您感到困惑。或者为了简单起见,请确保您的文本文件仅包含ASCII字符。
如果这对您没有帮助,那么您可能会在文件读取或可能的编码转换时弄乱某些地方。