LED*_*tom 1 c arrays sorting string
我正在学习使用C的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);
}
Run Code Online (Sandbox Code Playgroud)
qsort(s, strlen(s), sizeof(char *), compare);
Run Code Online (Sandbox Code Playgroud)
你似乎在qsort这里告诉你,你正在排序的类型是一个char*而不是一个char.除非你的指针与你的角色大小完全相同,否则它不会很好地结束:-)
你应该使用:
qsort(s, strlen(s), sizeof(char), compare);
Run Code Online (Sandbox Code Playgroud)
或者,因为sizeof(char)是永远 1,你可以逃脱:
qsort(s, strlen(s), 1, compare);
Run Code Online (Sandbox Code Playgroud)
虽然为了最大限度地减少代码更改,您需要在将来更改类型,但可以直接使用变量而不是类型:
qsort(s, strlen(s), sizeof(*s), compare);
Run Code Online (Sandbox Code Playgroud)
随着任何这些变化:
#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;
}
Run Code Online (Sandbox Code Playgroud)
你会看到你正在寻找的输出:
Before: atlantic
After: aacilntt
Run Code Online (Sandbox Code Playgroud)