0

我想对字符串列表进行排序。函数的参数qsort()是一个 c[i] 的列表,定义如下:

    //N is the number of words
    int N;
    scanf("%d",&N);
    //each c[i] is a word 
    char **c;
    c = malloc(N*sizeof(char*));

    for(i = 0; i < N; i++)
    {
      char *temp[100];
      scanf("%s", &temp);
      c[i]=strdup(temp);
    }

但是当我对列表进行排序时,结果是错误的。

正是为了调试,我添加了这个

for(i = 0; i < N; i++){
  j=compare (c[0],c[i]);
  printf("%d",j);
  printf("%s",c[i]);
}

我的输入是 '4;a;b;c;d' 我得到 '0b-1c-1d1a'

有人可以帮忙吗?

4

1 回答 1

2

这是不正确的:

char *temp[100];
scanf("%s", &temp);

temp100是一个未初始化的指针数组,char*没有存储 a char[]。改成:

char temp[100];
scanf("%99s", temp); /* Added maximum number of chars to prevent overrun. */

从你的评论:

int compare(const void* l, const void* r)
{
    return strcmp(l, r);
}

这应该是:

int compare(const void* a1, const void* a2)
{
    const char** s1   = a1;
    const char** s2   = a2;
    return strcmp(*s1, *s2);
}

来自 C99 标准第7.20.5.2 节的 qsort 函数

数组的内容根据 compar 指向的比较函数按升序排序,该函数使用两个指向被比较对象的参数调用。如果认为第一个参数分别小于、等于或大于第二个参数,则该函数应返回一个小于、等于或大于零的整数。

这意味着compare()函数参数的类型是char**,因此需要在执行字符串比较之前取消引用。

例如,请参阅http://ideone.com/rUG89

于 2012-08-29T13:10:04.477 回答