我正在尝试检查两个数组是否包含相同的元素。由于我不知道输入文件的排序是否正确,因此我想使用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
答案 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;
}