【发布时间】:2017-06-14 11:36:10
【问题描述】:
我正在用 C 编写一个程序,该程序应该根据奥运会的金牌数对国家进行排名。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Table {
char *country;
int amnt, gold, silver, bronze;
} Table;
char *arrayAlloc(int size) {
char *array;
array = (char *) malloc(sizeof(char) * size);
return array;
}
void readTable(Table *ptr) {
char buffer[100], *cpyPtr, *savePtr;
for (int i = 0; i < ptr->amnt; ++i) {
fgets(buffer, sizeof(buffer), stdin);
buffer[strlen(buffer) - 1] = '\0';
ptr[i].country = strtok_r(buffer, " ", &savePtr);
ptr[i].country = strdup(ptr[i].country);
cpyPtr = strtok_r(NULL, " ", &savePtr);
ptr[i].gold = strtol(cpyPtr, &cpyPtr, 10);
cpyPtr = strtok_r(NULL, " ", &savePtr);
ptr[i].silver = strtol(cpyPtr, &cpyPtr, 10);
cpyPtr = strtok_r(NULL, " ", &savePtr);
ptr[i].bronze = strtol(cpyPtr, &cpyPtr, 10);
}
}
void printTable(Table *ptr) {
for (int i = 0; i < ptr->amnt; ++i) {
printf("%s %d %d %d\n", ptr[i].country, ptr[i].gold,ptr[i].silver, ptr[i].bronze);
}
}
int compare(const void *p, const void *q) {
int l = ((Table *)p)->gold;
int r = ((Table *)q)->gold;
return (r - l);
}
int main(int argc, char const *argv[]) {
int N; // Amount of lines
scanf("%d", &N);
getchar();
Table tab[N];
tab->amnt = N;
tab->country = arrayAlloc(100);
readTable(tab);
qsort(&tab->gold, tab->amnt, sizeof(Table), compare);
printTable(tab);
free(tab->country);
return 0;
}
输入示例:
4
BRA 3 4 5
USA 23 76 34
CHN 23 54 12
GER 10 20 23
预期输出:
USA 23 76 34
CHN 23 54 12
GER 10 20 23
BRA 3 4 5
我得到了什么:
BRA 23 54 12
GER 23 76 34
CHN 3 4 5
USA 10 20 23
如您所见,它似乎以某种方式对其进行“排序”。然而,这远不是我需要完成的。 我已经尝试修改 compare() 函数,但没有成功。 我可能在这里错过了什么?
【问题讨论】:
-
变量
tab是一个数组。您应该排序的是 this 数组,而不是第一个元素gold成员。表达式tab->gold等于tab[0].gold。 -
您的minimal reproducible example 充满了错误,您的问题变得太宽泛了。
-
谢谢@Stargateur,下次我将按照此链接中的说明进行操作。