使用qsort()对数组排序

时间:2018-12-23 18:48:52

标签: c arrays struct integer qsort

我正在尝试检查两个数组是否包含相同的元素。由于我不知道输入文件的排序是否正确,因此我想使用qsort()首先对数组进行排序,然后他们将其与数组cmpvalues进行比较。

但是我无法qsort对数组cmpvalues进行排序。存储值的数组应像数组cmpvalues那样排序,以便比较容易得多。

#include <stdio.h>

#define MAXCOLR   14
#define MAXLINE  100
#define MAXCHR  1024   
#define _GNU_SOURCE

typedef struct {
    char color[MAXCOLR];
    int value;
} colorval_t;

int cmpfunc(const void *a, const void *b) {
    int aa, bb;
    aa = *(int *)a;
    bb = *(int *)b; 
    return (aa - bb);   
}

int main(int argc, char **argv) {
    size_t n;
    int cmpvalues[] = {
        65,
         2,
         3,
         4,
         5,
         6,
         7,
         8,
         9,
        10,
        74,
        81,
        75,
        65,
         2,
         3,
         4,
         5,
         6,
         7,
         8,
         9,
        10,
        74,
        81,
        75
    };
    size_t ndx = 0;
    char buf[MAXCHR];
    colorval_t arr[MAXLINE] = {{ .color = "" }};

    FILE *fp = argc > 1 ? fopen(argv[1], "r") : stdin;

    if (!fp) { 
        perror("file open failed");
        return 1;
    }

    while (ndx < MAXLINE && fgets(buf, MAXCHR, fp)) {
        char c;
        if (sscanf(buf, "%13s %d", arr[ndx].color, &arr[ndx].value) == 2)
            ndx++;
        else if (sscanf(buf, "%13s %c", arr[ndx].color, &c) == 2) {
            arr[ndx].value = c;
            ndx++;
        }
    }
    if (fp != stdin)
        fclose(fp);   

    for (size_t i = 0; i < ndx; i++)
        printf("arr[%2zu] : %s %d\n", i, arr[i].color, arr[i].value);

    //sorts the array
    qsort(arr, 26, sizeof(arr[26]), cmpfunc);
    for (n = 0 ; n < 26; n++) {   
        printf("%d ", arr[n].value);
    }

    //checks if arrays have the same element
    int j;
    for (j = 0; j < 26; j++) {
        if (arr[j].value != cmpvalues[j]) {
            printf("wrong");
            break;
        }
    }
    return 0;
}

输入:

RED A
RED 2
RED 3
RED 4
RED 5
RED 6
RED 7
RED 8
RED 9
RED 10
RED J
RED Q
RED K
BLACK 10
BLACK J
BLACK Q
BLACK K
BLACK A
BLACK 2
BLACK 3
BLACK 4
BLACK 5
BLACK 6
BLACK 7
BLACK 8
BLACK 9

1 个答案:

答案 0 :(得分:1)

您的比较功能错误。

qsort函数将指针传递给排序数组中的元素,因此,如果您有colorval_t数组,则参数的类型为colorval_t *

由于您将指针视为int *,因此不匹配,这将导致undefined behavior

这意味着您的比较功能应类似于

int cmpfunc (const void * a, const void * b) {
    colorval_t *first = (colorval_t *) a;
    colorval_t *second = (colorval_t *) b;

    return first->value - second->value;
}