C语言结构体数组循环输入赋值,为什么只能赋值一次?

#include<stdio.h>typedefstruct_xuesheng{charname[20];intxuehao;intshuxue;intyingyu;in... #include<stdio.h>

typedef struct _xuesheng{
char name[20];
int xuehao;
int shuxue;
int yingyu;
int cyuyan;
int zhongfen;
}xs;

int main()
{
xs x[2];
int i = 0;

printf("请依次输入姓名,学号,数学成绩,英语成绩,C语言成绩\n:");
for (i = 0; i < 2; i++){
gets_s(x[i].name, 20);
scanf_s("%d%d%d%d", &x[i].xuehao, &x[i].shuxue, &x[i].yingyu, &x[i].cyuyan);
x[i].zhongfen = x[i].shuxue + x[i].yingyu + x[i].cyuyan;
}

for (i = 0; i < 2; i++){
printf("学生%d:\n",i+1);
printf("姓名:%s\n", x[i].name);
printf("学号:%d\n数学:%d\n英语:%d\nc语言:%d\n总分:%d\n",
x[i].xuehao, x[i].shuxue, x[i].yingyu, x[i].cyuyan, x[i].zhongfen);
}
return 0;
}

输入到李四的时候,就不能输入了,百思不得其解啊。
不知道是哪里错了
展开
 我来答
GTA小鸡
高粉答主

2015-01-13 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.6万
采纳率:78%
帮助的人:1.2亿
展开全部
不要用gets()函数,这个函数会从输入缓冲区开始读入数据,直到碰到'\0'为止;
因此你上一次输入的回车符在下一次的gets()时会被自动读入
改用
scanf_s("%s%d%d%d%d", x[i].name,20,&x[i].xuehao, &x[i].shuxue, &x[i].yingyu, &x[i].cyuyan);
x[i].zhongfen = x[i].shuxue + x[i].yingyu + x[i].cyuyan;
}
即可。
寒寒家
2015-01-13 · TA获得超过2916个赞
知道大有可为答主
回答量:1482
采纳率:100%
帮助的人:1921万
展开全部
在scanf_s后面加上一句getchar();
有可能是输入第二行之后的那个回车被第二次循环的gets接收了。
追问
对就是这样,刚提完问题,就发现了,还是要多想啊,但是你那个在scanf_s后面加getschar()这个是什么意思?
追答
getchar()是从输入流里取一个字符,因为scanf_s是遇到空格和回车就被截断的,所以在第二行输入之后,输入流中会有个\n,如果不把它读出来,那么在第二次循环时,会被读入到[i].name中。通过getchar把\n取出来后,就不再影响第二次循环”李四“的输入了。

呃,你采纳的那个人的说法是错误的,gets不是遇到‘\0'之后结束,而是遇到'\n'结束
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式