gpt4 book ai didi

c - 如何使用 C 中的整数对带有字符串的结构进行排序?

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:20 24 4
gpt4 key购买 nike

我正在用 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() 函数,但没有成功。我可能在这里遗漏了什么?

最佳答案

qsort(&tab->gold, tab->amnt, sizeof(Table), compare);

前两个参数应该是指向数组的指针 (Table tab[N];) 和数组中元素的数量 (N),即:

qsort(tab, N, sizeof(Table), compare);

tab->amnt 中的元素数量确实正确,但是起始指针 &tab->gold 没有指向表的开头,但是在第一个元素的中间,所以 qsort 不能正常工作。


另外,你有这样的循环函数:

void printTable(Table *ptr) {
for (int i = 0; i < ptr->amnt; ++i) {

这意味着您在其第一个成员中携带数组的大小。这看起来很奇怪,这意味着除了数组的第一个成员之外,数组成员“amnt”在所有成员中都是多余的。

但是如果数组被排序,第一个数组成员不再是第一个,并且 ptr->amnt 不再包含正确的大小。

最好将 printTable 更改为

void printTable(Table *ptr, unsigned size) {
for (int i = 0; i < size; ++i) {

并用

调用它
printTable(tab, N);

同样适用于readTable


我也不确定这样做的目的是什么:

tab->country = arrayAlloc(100);

您正在为第一个数组成员中的 country 指针预分配空间,但无论如何 readTable 都会为 country 分配空间对所有数组成员使用 strdup


您可能还需要考虑检查用户输入的值或 N,或者通过 malloctab 分配内存。现在tab分配在栈上,如果用户输入一些大的数字导致栈溢出,可能会导致程序崩溃。

此外,由于您不检查 readTablestrtok_r 调用的返回值,如果用户提供格式错误的输入,程序将崩溃。

关于c - 如何使用 C 中的整数对带有字符串的结构进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44543671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com