g_array_sort无法处理字符串

时间:2015-11-19 18:00:40

标签: c arrays string glib

如何在C中使用 g_array_sort ? 我的代码使用比较字符串但我不能获取数据

int porownanie(gpointer a, gpointer b)
 {
 char *str_a = (char *)a; char *str_b = (char *)b; 
  printf("[%s:%s]=%d\n",str_a,str_b,g_ascii_strcasecmp(str_a,str_b));  
 return strcmp(str_a,str_b);
 }

主要功能

GArray* t = g_array_new(FALSE, FALSE, sizeof(char*));
char* a = "a", *b = "c", *c = "d"....
g_array_append_val(t, a);....

prt(t);printf("Sortujemy\n"); g_array_sort(t, (GCompareFunc)porownanie);
prt(t); printf("Porownanie %d\n",porownanie((char *)"a",(char *)"b"));

我明白了:

Tablica: b a f c d  
[z_:t_]=6 
[v_:x_]=-2 
[|_:v_]=6 
[|_:x_]=4
[t_:v_]=-2 
[z_:v_]=4 
[z_:x_]=2 
[z_:|_]=-2 
Tablica: a c d b f 
[a:b]=-1 Porownanie -1

我没有从g_aray_sort获取char *,我得到随机数据

1 个答案:

答案 0 :(得分:1)

sort函数接收指向要排序的项的指针,而不是值本身。你需要像

这样的东西
int porownanie(gpointer a, gpointer b)
{
  char **str_a = (char **)a; char **str_b = (char **)b; 
  printf("[%s:%s]=%d\n",*str_a,*str_b,g_ascii_strcasecmp(*str_a,*str_b));  
  return strcmp(*str_a,*str_b);
}

FWIW,这里的理由是项目可以是任何东西,包括你不想真正复制的大型结构......想想如果你有一个

阵列将会发生什么
struct Foo {
  guint8 input_buffer[4096];
  guint8 output_buffer[4096];
}

事实上,对于字符串,您通常会使用GPtrArray,而不是GArray。 sort函数仍然需要char **参数(因为GPtrArray实际上只是GArray的一个便利API),但它假定值为sizeof(void*)并使API更容易使用。