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