首页 > 解决方案 > 对 Char 类型的结构数组进行排序,qsort

问题描述

我遇到了 zsh: 分段错误(此错误与内存有关)我不知道它为什么会发生。我正在尝试为我的结构中的字符串创建一个比较函数。我需要程序能够按升序对字符串进行排序。

当前代码:

#include <stdio.h>
#include <string.h>
#include "stdlib.h"
# define MAX 7

typedef struct{
    double price;
    char title[60];
} game;
game gArr[MAX];

game buildGame(double num, const char *title);
void printGame(game);

int compGamesByTitle(const void * a,const void * b);

int main(){
    gArr[0] = buildGame(0.01, "Minecraft");
    gArr[1] = buildGame(22.79 , "Opus Magnum");
    gArr[2] = buildGame(7.79 , "TIS-100");
    gArr[3] = buildGame(14.99 , "Trainz");
    gArr[4] = buildGame(0 , "Code Combat");
    gArr[5] = buildGame(7.79, "Lemmings Revolution");
    gArr[6] = buildGame(64.96 , "Warcraft");

    qsort(gArr,sizeof(gArr)/sizeof(gArr[0]), sizeof(gArr[0]), compGamesByTitle);
    printf("Sorted Games:\n");
    for (int i = 0; i < MAX; i++){
        printGame(gArr[i]);
    }


    return 0;
}
int compGamesByTitle(const void *a,const void *b){
    char **aa = (char **)a;
    char **bb = (char **)b;

    return strcmp(*aa,*bb);
}

game buildGame(double num, const char *title){
    game g;
    g.price = num; strcpy(g.title, title);
    return g;
}
void printGame(game g){
    printf("Game g: %.2f, %s\n", g.price, g.title);
}

我认为问题与未分配的内存有关,但我不确定在哪里或为什么。

所需输出: 结构数组中的字符串应按字母顺序 (az) 升序排序。

标签: arrayscstructcharqsort

解决方案


不,您的问题与未初始化的内存无关。作为第四个参数传递的比较函数qsort接收指向正在比较的数组元素的指针。由于您gArr是一个game对象数组,但是您正在转换到char**内部,因此compGamesByTitle您最终会调用strcmp不指向以空字符结尾的字节字符串的指针,从而调用未定义的行为

您的比较函数应该看起来像这样

int compGamesByTitle(const void *a,const void *b){
    const game *aa = a;
    const game *bb = b;

    return strcmp(aa->title, bb->title);
}

推荐阅读