不是 c 中结构的预期结果循环

Not an Expected Result Loop of a Structure in c

我正在编写一个简单的 C 程序,该程序用于创建结构的循环。 所以我有一个 Students 的结构,其中包含姓名、年龄和年级。

所以输出将是这样的:

Enter name of student 1:
Enter age of student 1:
Enter Grade of student 1:

Enter name of student 2:
Enter age of student 2:
Enter Grade of student 2:

但是在我输入学生 1 的成绩后,它跳过了学生 2 的名字,所以我得到了这个:

Enter name of student 1:
Enter age of student 1:
Enter Grade of student 1:

Enter name of student 2: Enter age of student 2:

我正在使用 DevC++,这是我的代码:

#include <stdio.h>

struct student {
    char name[50];   // declare name using array
    int age;
    int grade;
};

int main ()
{
    struct student info[3];   //declare 3 students [3]
    int i;

    for(i=1;i<=3;i++) {    // this is for the looping, student 1, student 2, student 3
        printf("Enter name for student %d : ",i);
        scanf("%s",info[i].name);   // called struct using "." (dot)
        printf("Enter age for sudent %d : ",i);
        scanf("%d",&info[i].age);
        printf("Enter grade for student %d : ",i);
        scanf("%d",&info[i].grade);
    }
    return 0;

}

有人能找出我的代码有什么问题吗?或者请大家帮忙提个解决这个问题的建议,以获得预期的结果。

我试过你的代码并成功运行,我试着将它与你所做的进行比较。

结果是你声明scanf("%d",&info[i].grade);

收到一个 整数 输入。但是当我看到你的图片时,你的输入是 Character

所以只需在 Enter grade for student i

上用整数更改您的输入

您的代码的多项建议:

当使用scanf输入数据时,请始终检查其return值以确保正确输入了足够的数据,例如,当您为[=14]输入B时=] 字段,它 return 是零而不是一个:

int r = scanf("%d", &info[i].grade);
printf("%d\n", r); // 0

也如评论中所说,当你输入字符串时,请尝试使用fgets,因为它更安全并且不会在空格处停止。 scanf 不检查缓冲区溢出。

此外,在您的 for 循环中,您正在访问数组 info 的边界,您必须从 0.

开始

尝试以下操作:

int main ()
{
    struct student info[3];   //declare 3 students [3]
    int i;
    int r;
    for(i=0; i < 3; i++) {
        printf("Enter name for student %d : ",i);
        fgets(info[i].name, 50, stdin);
        printf("Enter age for sudent %d : ",i);
        r = scanf("%d", &info[i].age);
        if (r < 1) {
            printf("input error, exiting\n");
            return 1;
        }
        printf("Enter grade for student %d : ",i);
        r = scanf("%d", &info[i].grade);
        if (r < 1) {
            printf("input error, retry\n");
            return 1;
        }
    }
    return 0;
}

扩展 :(不错,顺便说一句!)

当您在 scanf 调用中输入非数字时,

    printf("Enter grade for student %d : ",i);

scanf 将无法读取输入(请参阅 hyde 的评论,谢谢) scanf 将跳过所有与提供的输入模式不匹配的输入,直到它到达换行符。任何未匹配读取的内容都保留在输入缓冲区中.因此,对 scanf 的后续调用从先前的输入中接收旧内容,在这种情况下确实匹配。

等级是 int 但你输入 char ('B',就像 8 :D),我修改三行:

#include <stdio.h>

struct student {
    char name[50];   // declare name using array
    int age;
    char grade; // int -> char
};

int main ()
{
    struct student info[3];   //declare 3 students [3]
    int i;

    for(i=1;i<=3;i++) {    // this is for the looping, student 1, student 2, student 3
        printf("Enter name for student %d : ",i);
        scanf("%s",info[i].name);   // called struct using "." (dot)
        printf("Enter age for sudent %d : ",i);
        scanf("%d",&info[i].age);
        getchar(); // reade '\n' after type age
        printf("Enter grade for student %d : ",i);
        scanf("%c",&info[i].grade); // %d -> %c
    }
    return 0;

}