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