程序在循环中重复时跳过“gets(string)”?

时间:2017-11-21 16:20:55

标签: c

下面显示的是我的程序,其中包含3个学生信息“id,name和marks”,在第一个循环中按预期运行,所有变量都按顺序排列,但在第二个循环中(依此类推),程序继续跳过gets(e[i].stname)。它只是打印关于学生姓名的问题,然后直接跳到他们的第一个标记。我尝试使用调试,但我的经历没有多大帮助。

#include<stdio.h>
struct stud
{
    int stno;
    char stname[20];
    int stmark[3];
};
void main()
{
    int n, m, i;
    struct stud e[3];
    for ( i = 0; i < 3; i++)
    {
        printf("enter the name of number %d student: \n", i+1);
        gets(e[i].stname);
        printf("enter the number of student number %d:\n", i+1);
        scanf_s("%d", &e[i].stno);
        for ( m = 1; m < 4; m++)
        {
            printf("enter the mark of module %d \n",m);
            scanf_s("%d", &e[i].stmark[m-1]);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这是混合scanfgets系列函数的陷阱之一。

scanf_s的调用正在读取整数值。执行此操作后,它们会在输入缓冲区中留下换行符。对scanf_s的后续调用很好,因为%d格式说明符会跳过任何前导空白字符。

gets函数会读取所有字符,直到下一个换行符。由于scanf_s在缓冲区中留下了换行符,gets会读取该换行符并立即返回。

使用gets格式说明符将scanf_s来电更改为%s

scanf_s("%19s", e[i].stname, sizeof(e[i].stname));