for里面的scanf语句不执行,赋值不成功

#include<stdio.h>
#include<string.h>
#define N 3
#define M 3
struct Student
{ int num;
char name[20];
float score[3];
float total;
}str[N];
main()
{
void inscore (struct Student a[],int i); //函数声明
int i,j;
printf("请按顺序输入学生的学号,姓名,数学、英语、C语言等信息:\n");
for(i=0;i<N;i++)
{ str[i].total=0;
scanf("%d",&str[i].num); //调试时,这里第一次循环的给输入,之后就再也不执行 →问题1
gets(str[i].name); //定义了 str[i].name[20],一定要输够20个字符回车才行→问题2
inscore(str,i);
for (j=0;j<3;j++)
str[i].total=str[i].total+str[i].score[j];
}
for(i=0;i<N;i++)
printf("num.%d%s:数学:%3lf,英语:%3lf,c语言:%3lf,总分:%3lf\n",str[i].num,str[i].name,str[i].score[0],str[i].score[1],str[i].score[2],str[i].total);

}
void inscore(struct Student a[],int i)
{ int j;
for(j=0;j<3;j++)
scanf("%lf",&a[i].score[j]);
}
编译连接0error 0warning,就是粗不来,给跪了

scanf只是模式匹配函数,当你输入学号并回车时,只有学号保存到了str[i].num,剩余一个换行符留在缓冲区;
gets函数不会跳过任意空白符,但当只要遇到换行符就会停止,并用空字符替换换行符

所以,你的gets函数根本就没有储存信息(它读取了上次遗留的换行符而终止了)

另外
scanf("%lf")中%lf是double类型的转换说明,你定义的结构体中却是float
gets函数现在已经不推荐使用,应用fgets替代

还有你的C代码很不标准,不符合c99

你试试在你的scanf代码下面加上:
while (getchar() != '\n')
;
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-06-12
在scanf前面一行加上
fflush(stdin); //清空键盘缓存
第二个问题没太明白,输完直接回车不行吗追问

nope

追答

回车按少了

第2个回答  2014-06-12
gets(str[i].name);
这个语句是以回车作为输入结束的,不会以空格作为结束。
请检查你输入分数前是否有换行输入。追问

还是不行啊,本来用scanf来赋值,只有第1次循环的时候才执行,后来才改成gets,结果还是一样

追答

scanf("%1f",&a[i].score[j]);

-->
scanf("%f",&a[i].score[j]);
多了一个1

相似回答
大家正在搜