结构数组的定义和引用中出现的循环错误

我在做书上的练习要求为输入5个学生的基本信息,然后将学号最大的输入的屏幕端
这是我的代码

#include <stdio.h>
#include <string.h> 
struct STU{
    char name[200];
    int age;
    char sex;
    char num[20];
};
void OutputSTU(struct STU stu[5]);
int main(void)
{
    int i;
    struct STU stu[5];
    for(i=0;i<5;i++){
        printf("请输入第%d个学生的信息:\n",i+1);
        scanf("%s%d% c%s",stu[i].name,&stu[i].age,&stu[i].sex,&stu[i].num);
    }
    OutputSTU(stu);
    return 0;
}
void OutputSTU(struct STU stu[5])
{
    struct STU stumax=stu[0];//函数中借用一个暂时的stumax变量 
    int j;
    for(j=1;j<5;++j){
        if(strcmp(stumax.num,stu[j].num) < 0){
            stumax=stu[j];
        }
    }
    printf("姓名:%s\n年龄:%d\n性别:%c\n学号:%s\n",stumax.name,&stumax.age,stumax.sex,stumax.num);
    return 0;
}

当我运行时出现了这样的问题,如图:

img


输入完第一和第二个之后发现第三和第四的printf一块打印了出来
我不理解这是怎么回事
同时这是我的warning:
[Warning] 'return' with a value, in function returning void

warning : 删除最后面的return 0; 第31行
你在main函数的for方法里面加一个while(getchar()!='\n')
清除一下缓冲

调试了一下你的程序,问题就出在scanf上,首先里面那个%和c之间有个空格不知道是不是你打错了。但其实scanf比较忌讳多种数据类型同时读取,因为终端录入的数据不调试的话你很难发现每一个%对应录入了什么,拿你现在的程序做个例子:

img


左边是调试台的信息,可以看到输给第一个学生的性别信息'm'到了第二个学生的name里,而学号则到了第二个学生的年龄中,总之各种意义上的混乱。
然后我印象里中文字符好像不止一个ascii码,你的性别这一项用一个char来存储却输入“男”应该是不行的。

提一些修改建议,楼主可以尝试去做一下:

  1. 保险起见每个学生的每一项信息可以单独输入,用四个scanf分别对name、age,sex和code进行输入,多几行重复代码的事情会让犯错率低很多也很省事。
  2. 如果一定要一行内输入完毕可以全部用字符串接收也就是%s,然后用空格对字符串进行一个分割,比较麻烦的是年龄那里需要做一个整数的转换,不过也不难

希望我的回答能帮到你,有什么不理解的地方可以再问:-)