我正在学习使用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);
}
答案 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);