c语言程序设计,结构体数组输入求解

源代码如下:




```#include<stdio.h>#include<time.h>#include<string.h>#include<stdlib.h>#include<conio.h>#include<windows.h>#pragma warning(disable:4996)void menu();void function1(void);//输入、添加void function2();//排序void function3();//查询void function4();//修改void function5();//删除void function6();//退出struct  student {    char name[30];    char studentID[30];    int sex[30];    double BMI[30];//体重指数    int vital[30];//肺活量    int yin_yang[30];    double score[30];}stu[30];int main(){    printf(" \n");    printf("                欢迎使用学生体测成绩判定系统        \n");    printf(" \n");    menu();}void menu(){        printf("                1、输入(添加)学生个人信息       \n");    printf("                 2、对学生信息进行排序             \n");    printf("                 3、查询学生体测成绩                    \n");    printf("                 4、修改学生个人指标                 \n");    printf("                 5、删除学生个人信息                 \n");    printf("                 6、退出系统                        \n");    printf("\n");    int chioce;    printf("                 请选择相应的选项:                 \n");    loop:scanf_s("%d", &chioce);    switch (chioce)    {    case 1:system("cls"); function1(); break;    case 2:system("cls"); function2(); break;    case 3:system("cls"); function3(); break;    case 4:system("cls"); function4(); break;    case 5:system("cls"); function5(); break;    case 6:system("cls"); function6(); break;    default:    {        printf("输入错误,请再次输入\n");            goto loop;    }    }}void function1(void){    system("cls");    int n=0,q;loop:printf("请按顺序输入学生学号、姓名、性别(男生输入1,女生输入2)、体重指数、肺活量、引体向上或仰卧起坐数\n");    scanf_s("%s %s %d %lf %d %d", &stu[n].studentID, &stu[n].name, &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang);    printf("%s %s %d %lf %d %d", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang);    fflush(stdin);    for(n=0;n<=10;n++)    {            if (n>=1)        {            char *st1, *st2;            st1 = stu[n].studentID, st2 = stu[n - 1].studentID;            if (st1 == st2)            {                printf("\n该学生已存在\n");                printf("请问是否还需要添加新的学生信息 '1'代表是,  '0'代表否,且回到菜单页面 \n");                scanf_s("%d", &q);                if (q == 1)                {                    goto loop;                }                else if (q == 0)                {                    system("cls");                    menu();                }                else                {                    system("cls");                    menu();                }            }        }        goto loop;    }    printf("请问是否还需要添加新的学生信息    '1'代表是,   '0'代表否,且进入菜单界面\n");    scanf_s("%d", &q);    if (q == 1)    {        n = n + 1;        goto loop;    }    else if (q == 0)    {        n = n + 1;        system("cls");        menu();    }    else    {        n = n + 1;        system("cls");        menu();    }}

求问这里为什么出错:

    scanf_s("%s %s %d %lf %d %d", &stu[n].studentID, &stu[n].name, &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang);
    printf("%s %s %d %lf %d %d", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang);

```

提示如下(看得不是很懂):

img

顺便求问为什么我这个程序运行到一半直接跳出了

格式字符串和提供的参数之间存在类型不匹配.
具体来说,第一个scanf_s()的格式字符串中使用了%s来接收两个字符串型参数stu[n].studentID和stu[n].name,这是正确的用法。但在printf()的格式字符串中,对应的参数都是字符串,却使用了%d和%lf来表示整型和浮点型参数,这就会导致类型不匹配的问题,进而导致输出结果出错。
同样的问题也存在于第一个scanf_s()中,其中有一个%lf用于读取浮点型变量,但在printf()中却使用了%d来输出相应的变量。
为了避免这种问题,需要保证scanf_s()和printf()中的格式字符串和提供的变量参数类型一一对应,并且数量也应该匹配。

scanf_s("%s%s%d%lf%d%d", stu[n].studentID, sizeof(stu[n].studentID), stu[n].name, sizeof(stu[n].name), &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang);

printf("%s %s %d %lf %d %d", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang);

结构体数组中的成员变量不应设置数组:


```c
struct student {
    char name[30];
    char studentID[30];
    int sex;
    double BMI;//体重指数
    int vital;//肺活量
    int yin_yang;//引体向上或仰卧起坐数
    double score;
}stu[30];

在函数中添加学生信息时,将循环控制变量n的初始值设为当前已经从键盘输入的学生人数。并且读入字符串时需要指定数组的长度,避免信息溢出。
将循环内置的goto语句去掉,改为使用while循环。如果需要再次输入新的信息,则将n加1。
对于学生信息输入重复的情况,可以将其作为特殊情况处理,防止进入无限循环。建议使用break语句退出当前循环,而不是使用goto语句。
在function1()函数中,在以输入完成后询问是否继续添加学生信息时,应该将循环控制变量n加1。
下面是按照上述修改的function1()函数代码,您可以参考一下:


```c
void function1(void)
{
    system("cls");
    int n = 0, q, i;

    while (n < 30) {
        printf("请按顺序输入学生学号、姓名、性别(男生输入1,女生输入2)、体重指数、肺活量、引体向上或仰卧起坐数:\n");
        scanf_s("%s %s %d %lf %d %d", stu[n].studentID, sizeof(stu[n].studentID), stu[n].name, sizeof(stu[n].name), &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang);
        printf("%s %s %d %lf %d %d\n", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang);

        // 判断是否有重复的学生信息
        for (i = 0; i < n; i++) {
            if (strcmp(stu[n].studentID, stu[i].studentID) == 0) {
                printf("\n该学生已存在\n");
                printf("请问是否还需要添加新的学生信息 '1'代表是,  '0'代表否,且回到菜单页面:\n");
                scanf_s("%d", &q);
                if (q == 1) {
                    break;
                }
                else if (q == 0) {
                    system("cls");
                    menu();
                }
                else {
                    system("cls");
                    menu();
                }
            }
        }

        // 判断是否需要继续输入新的学生信息
        printf("请问是否还需要添加新的学生信息,'1'代表是,'0'代表否,且回到菜单页面:\n");
        scanf_s("%d", &q);
        if (q == 1) {
            n++;
        }
        else if (q == 0) {
            system("cls");
            menu();
        }
        else {
            system("cls");
            menu();
        }
    }
}

希望能对您有所帮助!