C 计数器增加时For循环跳过

C 计数器增加时For循环跳过,c,for-loop,C,For Loop,我想写一个程序,获取有关学生姓名、成绩和生日的数据,并将其保存到一个结构中。我已经编写了一个“for循环”来实现这一点,但是随着我的增加,我的循环不能正常工作。 编辑: 因此,我的循环在i=0时运行良好,但当i=1时,它无法正确扫描信息 投入: name:a birthdate:79/4/18 grades:20 20 20 name:b birthdate:76/12/2 grades:16 13 19

我想写一个程序,获取有关学生姓名、成绩和生日的数据,并将其保存到一个结构中。我已经编写了一个“for循环”来实现这一点,但是随着我的增加,我的循环不能正常工作。 编辑: 因此,我的循环在i=0时运行良好,但当i=1时,它无法正确扫描信息

投入:

       name:a
       birthdate:79/4/18
       grades:20 20 20
       name:b
       birthdate:76/12/2
       grades:16 13 19

       Output:
       Enter student's name: a
       Enter student's birthday(y/m/d): 79 4 18 
       Enter student's grades: 20 
       Enter student's grades: 20 
       Enter student's grades: 20 
       Enter student's name: 
       Enter student's birthday(y/m/d): 
       b
       Enter student's grades: 
       Enter student's grades: 
       Enter student's grades:
**

#包括
结构日期
{
国际年;
整月;
国际日;
};
类型定义结构
{
字符名[30];
浮球等级[3];
结构日期出生日期;
}学生;
int main()
{
学生名单[2];
int i,j;
对于(i=0;i你应该做:

scanf("%d/%d/%d", &list[i].birthdate.year, &list[i].birthdate.month, &list[i].birthdate.day);
而不是:

scanf("%d%d%d",&list[i].birthdate.year,&list[i].birthdate.month,&list[i].birthdate.day);
警告:不要使用
get()
,这很危险。您可以按如下方式替换该语法:

fflush(stdin); // MUST REQUIRED OR INPUT WILL BE SKIPPED
fgets(list[i].name, 30, stdin);
样本输出:


你能显示任何“崩溃”输出吗?同时也显示你的输入。将问题和所有澄清放在那里“输入学生姓名:输入学生生日(y/m/d):b”当b应该是名称时。我确信这与被吃掉的字符
\n
有关scanf@Jabberwocky谢谢,我刚刚添加了输入,并更清楚地解释了我的问题。当你进入最后一个年级(
20
)数字取自输入缓冲区,但换行符保留在那里。该换行符用于读取下一个用户名的空白字符串。解决方案:始终使用
fgets()
进行用户输入。注意:
fgets(list[i].name,30,stdin);
get(list[i].name)不完全相同
。使用
fgets
可以在字符串的末尾获得
\n
,但使用
gets
函数get()被认为是危险的,而不是危险的,我使用了fgets()。谢谢,我试过了,但同样的问题还是发生了,但我使用了“scanf(%s)”,&list[I].name;”问题解决了,可以对字符串使用scanf吗?@Ava抱歉,我已经编辑了我的代码。我在不知不觉中犯了一个错误。请在
fgets()之前使用
fflush(stdin)
而不是之后使用
fgets()。
fflush(stdin); // MUST REQUIRED OR INPUT WILL BE SKIPPED
fgets(list[i].name, 30, stdin);
Enter student's name:
a
Enter student's birthday(y/m/d):
2003/03/05
Enter student's grades:
12
Enter student's grades:
35
Enter student's grades:
66
Enter student's name:
b
Enter student's birthday(y/m/d):
2005/02/01
Enter student's grades:
44
Enter student's grades:
88
Enter student's grades:
5