我的代码有问题。我无法得到预期的答案。我搜索了这个,但我找不到任何东西。我无法找到我的错误..
这是我的代码使用g_hash_table
# include <stdio.h>
# include <glib.h>
# include <stdlib.h>
GHashTable *hash = NULL;
int check_sth_blacklist(char *sth)
{
return g_hash_table_contains(hash,sth);
}
main()
{
hash = g_hash_table_new(g_str_hash,g_str_equal);
char *sth = (char*) malloc(32);
scanf("%s",sth);
g_hash_table_add(hash,sth);
scanf("%s",sth);
printf("%d\n",check_sth_blacklist(sth + sizeof(char)*2));
free(sth);
}
在我的输入中我写了:
cde
abcde
我认为cde
字符串会添加到g_hash_table。然后当我在cde
中询问字符串abcde
时,它会返回0值。
答案 0 :(得分:0)
我相信当你将malloc&#39字符串传递给g_str_hash
下的GHashTable时,你将字符串的控制权转移到哈希表中 - 它取决于它在时机成熟时释放它,等等你不应该再次使用那个空间分配了!
为比较创建一个新字符串:
#include <stdio.h>
#include <glib.h>
#include <stdlib.h>
#include <string.h>
GHashTable *hash = NULL;
int check_sth_blacklist(char *sth)
{
return g_hash_table_contains(hash, sth);
}
int main()
{
hash = g_hash_table_new(g_str_hash, g_str_equal);
char *sth = (char*) malloc(32);
scanf("%s", sth);
g_hash_table_add(hash, sth);
char *nth = (char*) malloc(32);
scanf("%s", nth);
printf("%d\n", check_sth_blacklist(nth + 2));
free(nth);
g_hash_table_destroy(hash);
return 0;
}
让散列管理您放入其中的任何字符串(键或值),当散列本身被销毁时,所有字符串都应该是独立且可释放的。运行时,这给了我:
bash-3.2$ ./a.out
cde
abcde
1
bash-3.2$