c语言运行错误 求大佬帮助

图片说明
以下是我写的代码
#include
#include

typedef struct BirthDate {
int year;
int month;
int day;
}birthdate;

typedef struct Student{
unsigned int num;
char name[20];
unsigned char sex;
birthdate date;
int scores[4];
}student;

void ShowStuInfo( student*pstudent);
double Average(student*students,int N,int i);

int main()
{
int N;
printf("请输入学生数量\n");
scanf("%d",&N);
student* students;
int i;//学科代码
int count;//学生信息输入循环变量
double ave=0;
//分配学生结构体数组需要的内存
students=(student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for(count=0;count<N;count++)
{
ShowStuInfo(students);

}
//求某一学科的平均成绩
ave=Average(students,N,i);
printf("%lf",ave);
free(students);
return 0;
}

void ShowStuInfo(student*pstudent)
{
printf("请输入学号 姓名 性别 出生年-月-日\n");
scanf("%d %s %c %d-%d-%d",
&pstudent->num,
pstudent->name,
&pstudent->sex,
&pstudent->date.year,
&pstudent->date.month,
&pstudent->date.day);
printf("请输入各科成绩\n");
scanf("%d %d %d %d",
&pstudent->scores[0],
&pstudent->scores[1],
&pstudent->scores[2],
&pstudent->scores[3]
);

}

double Average(student*students,int N,int i)
{
int j;
double Ave;
for(j=0;j {
Ave+=students->scores[i];
}
Ave/=N;
return Ave;
}

以下是运行结果
图片说明
求问哪错了

unsigned char sex,你一个汉字怎么能放在char类型。

1、性别输入是汉字,故 scanf %c 应变为%s, sex变量也应改为3个字节的数组。
2、ShowStuInfo(students);应改为 ShowStuInfo(&students[count]); 你这样永远输入的是第一个学生的信息。
3、ave=Average(students,N,i); i 没有赋值。
4、Average内部有错误,可能是你代码没有贴全了,你这样编译都不可能过了。

改了一下自己看看吧:

 #include<cstdio>  
#include<cstdlib>  
#include<cstring>  
typedef struct BirthDate {
    int year;
    int month;
    int day;
}birthdate;
typedef struct Student{
    unsigned int num;
    char name[20];
    unsigned char sex;
    birthdate date;
    int scores[4];
}student;
void ShowStuInfo(student*pstudent);
double Average(student*students, int N, int i);
int main()
{
    int N;
    printf("请输入学生数量\n");
    scanf("%d", &N);
    student* students;
    int i;//学科代码
    int count;//学生信息输入循环变量 
    double ave = 0;
    //分配学生结构体数组需要的内存 
    students = (student*)malloc(N*sizeof(student));
    //通过函数显示每个学生的信息
    for (count = 0; count < N; count++)
    {
        ShowStuInfo(&students[count]);

    }
    //求某一学科的平均成绩
    for (int i = 0; i < 4;i++)
    {
        ave = Average(students, N, i);
        printf("科目%d:%lf", i, ave);
    }

    free(students);
    return 0;
}
void ShowStuInfo(student*pstudent)
{
    printf("请输入学号 姓名 性别 出生年-月-日\n");
    scanf("%d %s %c %d-%d-%d",
        &pstudent->num,
        pstudent->name,
        &pstudent->sex,
        &pstudent->date.year,
        &pstudent->date.month,
        &pstudent->date.day);
    printf("请输入各科成绩\n");
    scanf("%d %d %d %d",
        &pstudent->scores[0],
        &pstudent->scores[1],
        &pstudent->scores[2],
        &pstudent->scores[3]
        );
}
double Average(student*students, int N, int i)
{
    int j;
    double Ave = 0;
    for (j = 0; j<N;j++)
    {
        Ave += students[j].scores[i];
    }
    Ave /= N;
    return Ave;
}

tudents=(student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for(count=0;count<N;count++)
{
ShowStuInfo(students);

}
你申请的是N个学生的地址空间,而你ShowStuInfo函数入参只是一个学生的结构指针,函数体里也是这样赋值的,这是最大问题。
成绩统计也是这个问题

Average内部有错误

图片说明

应该是在void ShowStuInfo(student*pstudent)的scanf函数上,有%s 和%c,这些空格和回车都是算输入的。这样导致后面不用输出了,总之,C语言的scanf使用起来一定要注意。

#include

#include

#include

typedef struct BirthDate {
int year;
int month;
int day;
}birthdate;
typedef struct Student{
unsigned int num;
char name[20];
unsigned char sex;
birthdate date;
int scores[4];
}student;
void ShowStuInfo(student*pstudent);
double Average(student*students, int N, int i);
int main()
{
int N;
printf("请输入学生数量\n");
scanf("%d", &N);
student* students;
int i;//学科代码
int count;//学生信息输入循环变量
double ave = 0;
//分配学生结构体数组需要的内存
students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
ShowStuInfo(&students[count]);

}
//求某一学科的平均成绩
for (int i = 0; i < 4;i++)
{
    ave = Average(students, N, i);
    printf("科目%d:%lf", i, ave);
}

free(students);
return 0;

}
void ShowStuInfo(student*pstudent)
{
printf("请输入学号 姓名 性别 出生年-月-日\n");
scanf("%d %s %c %d-%d-%d",
&pstudent->num,
&pstudent->name,
&pstudent->sex,
&pstudent->date.year,
&pstudent->date.month,
&pstudent->date.day);
printf("请输入各科成绩\n");
scanf("%d %d %d %d",
&pstudent->scores[0],
&pstudent->scores[1],
&pstudent->scores[2],
&pstudent->scores[3]
);
}
double Average(student*students, int N, int i)
{
int j;
double Ave = 0;
for (j = 0; j<N;j++)
{
Ave += students[j].scores[i];
}
Ave /= N;
return Ave;
}

没注意你性别的输入,我是按英文输入的,改好了

 #include<cstdio>  
#include<cstdlib>  
#include<cstring>  
typedef struct BirthDate {
    int year;
    int month;
    int day;
}birthdate;
typedef struct Student{
    unsigned int num;
    char name[20];
    char sex[20];
    birthdate date;
    int scores[4];
}student;
void ShowStuInfo(student*pstudent);
double Average(student*students, int N, int i);
int main()
{
    int N;
    printf("请输入学生数量\n");
    scanf("%d", &N);
    student* students;
    int i;//学科代码
    int count;//学生信息输入循环变量 
    double ave = 0;
    //分配学生结构体数组需要的内存 
    students = (student*)malloc(N*sizeof(student));
    //通过函数显示每个学生的信息
    for (count = 0; count < N; count++)
    {
        ShowStuInfo(&students[count]);

    }
    //求某一学科的平均成绩
    for (int i = 0; i < 4;i++)
    {
        ave = Average(students, N, i);
        printf("科目%d:%lf", i, ave);
    }

    free(students);
    system("pause");
    return 0;
}
void ShowStuInfo(student*pstudent)
{
    printf("请输入学号 姓名 性别 出生年-月-日\n");
    scanf("%d %s %s %d-%d-%d",
        &pstudent->num,
        pstudent->name,
        pstudent->sex,
        &pstudent->date.year,
        &pstudent->date.month,
        &pstudent->date.day);
    printf("请输入各科成绩\n");
    scanf("%d %d %d %d",
        &pstudent->scores[0],
        &pstudent->scores[1],
        &pstudent->scores[2],
        &pstudent->scores[3]
        );
}
double Average(student*students, int N, int i)
{
    int j;
    double Ave = 0;
    for (j = 0; j<N;j++)
    {
        Ave += students[j].scores[i];
    }
    Ave /= N;
    return Ave;
}

students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
    ShowStuInfo(&students[count]);

}
    这样虽然暂时可行,但可读性很差,你可以用一个指针数组来保存每个学生的结构指针,这只是个人意见,写代码要保持简洁,不然的话你过几天回过头来再
    看自己写的代码一时半会都不一定看的明白。

students = (student*)malloc(N*sizeof(student));
//通过函数显示每个学生的信息
for (count = 0; count < N; count++)
{
ShowStuInfo(&students[count]);

}