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

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)

pax*_*blo 5

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)

  • `sizeof*s`将是另一种选择,如果代码稍后适用于`wchar_t`字符串,则可能有用 (2认同)