下面显示的是我的程序,其中包含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]);
}
}
}
答案 0 :(得分:1)
这是混合scanf
和gets
系列函数的陷阱之一。
对scanf_s
的调用正在读取整数值。执行此操作后,它们会在输入缓冲区中留下换行符。对scanf_s
的后续调用很好,因为%d
格式说明符会跳过任何前导空白字符。
gets
函数会读取所有字符,直到下一个换行符。由于scanf_s
在缓冲区中留下了换行符,gets
会读取该换行符并立即返回。
使用gets
格式说明符将scanf_s
来电更改为%s
:
scanf_s("%19s", e[i].stname, sizeof(e[i].stname));