在C中使用qsort()后,对于获取奇怪的字符感到困惑

时间:2015-10-19 01:42:24

标签: c arrays string sorting

我正在学习使用C&#39s的qsort()来排序一组字符char s[]="atlantic"。返回qsort()后,我打印出s,但我只有不可读的字符。我认为我的compare()是正确的,因为所有qsort()需要用它来确定* a是否在*之前/等于/之后。有没有人知道导致printf("After: %s\n", s);行不起作用的原因是什么?感谢。

int compare(const void * a, const void * b){
  return *(char*)a - *(char*)b;
}
void doWork(char* s) {
  printf("Before: %s\n", s);
  qsort(s, strlen(s), sizeof(char *), compare);
  printf("After: %s\n", s); 
}

3 个答案:

答案 0 :(得分:5)

qsort(s, strlen(s), sizeof(char *), compare);

您似乎在此告诉qsort您要排序的类型是char*而不是char。除非你的指针与你的角色完全相同,否则不会很好地结束: - )

您应该使用:

qsort(s, strlen(s), sizeof(char), compare);

或者,由于sizeof(char) 总是 1,您可以逃脱:

qsort(s, strlen(s), 1, compare);

尽管为了尽量减少代码更改,您需要在将来更改类型,但可以直接使用变量而不是类型:

qsort(s, strlen(s), sizeof(*s), compare);

任何这些变化:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int compare(const void * a, const void * b){
    return *(char*)a - *(char*)b;
}

void doWork(char* s) {
    printf("Before: %s\n", s);
    qsort(s, strlen(s), sizeof(*s), compare);
    printf("After:  %s\n", s);
}

int main (void) {
    char s[] = "atlantic";
    doWork(s);
    return 0;
}

你会看到你正在寻找的输出:

Before: atlantic
After:  aacilntt

答案 1 :(得分:2)

s的元素不是char *类型,因此它们没有sizeof (char *),而是使用sizeof (char)

qsort(s, strlen(s), sizeof(char), compare); 

答案 2 :(得分:1)

问题是您将sizeof(char*)传递给qsort,其中sizeof(char)是合适的。

使用

qsort(s, strlen(s), sizeof(char), compare);