Skip to content

关于gets在循环中的使用

约 255 字小于 1 分钟

2024-11-03

问题

 for (int i = 0; i < 3; i++) {
        printf("Enter name\n");
        gets(stu[i].name);
        printf("Enter math\n");
        scanf("%d", &stu[i].math);
        printf("Enter english\n");
        scanf("%d", &stu[i].eng);

        stu[i].aver = (float) (stu[i].math + stu[i].eng) / 2;

    }

这是一个接受学生名字、科目分数的循环

但结果

Enter name
li
Enter math
78
Enter english
89
Enter name
Enter math
......

在第八行应该接收name的输入,但却被跳过了

 for (int i = 0; i < 3; i++) {
        printf("Enter name\n");
        scanf("%s", stu[i].name);
        printf("Enter math\n");
        scanf("%d", &stu[i].math);
        printf("Enter english\n");
        scanf("%d", &stu[i].eng);

        stu[i].aver = (float) (stu[i].math + stu[i].eng) / 2;

    }

当换成scanf()接收后

Enter name
li
Enter math
78
Enter english
89
Enter name
wang
Enter math
......

此时接收正常

原因

在gtes()前的scanf()执行后会遗留一个'/n'在缓冲区里,而在执行gets()时会将那个回车读取,因而跳过。

解决方法

使用 fflush(stdin) 函数清理默认缓冲区

或使用scanf()

贡献者: edge-sky