使用 qsort() 对数组进行排序
Sorting an array using 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
你的比较功能是错误的。
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;
}
我正在尝试检查两个数组是否包含相同的元素。因为我不知道输入文件是否排序正确,所以我想先使用 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
你的比较功能是错误的。
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;
}