c - 使用 C 中的结构按姓名和年级对学生列表进行排序

标签 c sorting struct

我正在编写一个程序,按姓名和年级对学生列表进行排序。当我尝试编译时收到以下错误:

ex11.c: In function 'compareByGrade':
ex11.c:46: error: request for member 'grade' in something not a structure or union
ex11.c:47: error: request for member 'grade' in something not a structure or union
ex11.c: In function 'compareByName':
ex11.c:56: error: request for member 'name' in something not a structure or union
ex11.c:57: error: request for member 'name' in something not a structure or union

This is the header file:

#define CLASS_SIZE 10

struct student {
    char *name;
    int  idnumber;
    char grade;
};

这是主文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ex11.h"

int main(void)
{
    int c, i;
    FILE *data;
    struct student tmp, class[CLASS_SIZE];
    void *nameArray[CLASS_SIZE], *gradeArray[CLASS_SIZE];
    static int compareByGrade(const void *first, const void *second);
    static int compareByName(const void *first, const void *second);

    data = fopen("data", "r");                         /* open data file */

/* Move data into struct */

    for (i = 0; i < CLASS_SIZE; ++i) {
            fscanf(data, "%s%d%c", tmp.name, tmp.idnumber, tmp.grade);
            class[i].name = tmp.name;
            class[i].idnumber = tmp.idnumber;
            class[i].grade = tmp.grade;
    }
    fclose(data);                                     /* close data file */
    qsort(nameArray, CLASS_SIZE, sizeof(*nameArray), &compareByName);
    qsort(gradeArray, CLASS_SIZE, sizeof(*gradeArray), &compareByGrade);
}

/* Function to sorty by grade */

static int compareByGrade(const void *first, const void *second)
{
    const char *firstGrade = (*(const char **) first) -> grade; /* line 46 */
    const char *secondGrade = (*(const char **) second) -> grade; /* line 47 */

    return strcmp(firstGrade, secondGrade);
}

/* Function to sort by name */

static int compareByName(const void *first, const void *second)
{
    const char *firstName = (*(const char **) first) -> name; /* line 56 */
    const char *secondName = (*(const char **) second) -> name; /* line 57 */

    return strcmp(firstName, secondName);
}

我做错了什么?

最佳答案

同意xaxxon的观点。 程序处理struct Student class,nameArray和gradeArray从未初始化。

顺便说一句,我想不要使用名为 class 的结构,它与 C++ 的关键字混淆。

等级是字符,但strcmp()需要字符串来比较。

建议: 在main()中,

qsort(class, CLASS_SIZE, sizeof(struct student*), &compareByName);
qsort(class, CLASS_SIZE, sizeof(struct student*), &compareByGrade);

外面,

int compareByGrade(const void *first, const void *second)
{
    const char firstGrade = ((struct student *)first) -> grade;
    const char secondGrade = ((struct student *)second) -> grade;
    return firstGrade<secondGrade?-1:(firstGrade==secondGrade?0:1);
}

/* Function to sort by name */

int compareByName(const void *first, const void *second)
{
    const char *firstName = ((struct student *)first) -> name;
    const char *secondName = ((struct student *)second) -> name;

    return strcmp(firstName, secondName);
}

compareByGrade()的返回值表达式与compareByName()的作用相同

关于c - 使用 C 中的结构按姓名和年级对学生列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16513333/

相关文章:

c - 如何检查实际时间是否在字符串格式的时间范围之间

Perl 数值排序 : how to ignore leading alpha character

struct - 如何从函数访问结构的实例字段?

带赋值的c结构语法?

c - 如何摆脱预期的 'int(*)(const struct dirent *)' 但参数类型为 'int (*)(struct dirent *)' 错误?

c - 访问指针数组以进行读写操作

c - C中的霍夫曼编码

c++ - 可靠的 UDP 算法?

python - python中的排序算法帮助

java - groupingBy 后排序列表