因为前面 scanf("%d",&n);用户输入了数据和换行符‘\n’,在读取了数据之后,输入缓存里就残留了一个‘\n’。
之后第一次使用gets()会读取输入缓存里上次残留的‘\n’,也就是读取空字符串给a.num,而不是读取新输入的字符串。
第二次使用gets()才是读取新输入的'a100'字符赋值给a.name。
可以在 scanf("%d",&n); 之后用 setbuf(stdin, NULL); 清除输入缓存。 或者用getchar() 把缓存里上次残留的‘\n’先读取掉
把代码贴一下,我试一下看看哪里出错了。
1、scanf("%d",&n);用户输入了数据按回车之后,输入会产生一个缓存\n’。之后在第一次使用gets()时就会读取到输入缓存里的‘\n’,就会读取一个空字符串给a.num,再次输入的字符串会赋值给a.name。
2、建议在gets上边使用getchar()把缓存里的‘\n’读取掉就可以了
3、结构体中num和name需要指定长度,例如char num[8]和char name[10]
4、函数形参值是不可修改的,你的input函数传入的形参 struct Student a 需要修改成指针的形式,所有修改之后参考代码如下:
struct Student {
char num[8];
char name[10];
int r1;
int r2;
int r3;
};
void input(struct Student *a);
void print(struct Student a);
int main() {
int N;
scanf("%d", &N);
struct Student A;
while (N) {
input(&A);
print(A);
N--;
}
return 0;
}
void input(struct Student *a) {
getchar();
gets((*a).num);
gets((*a).name);
scanf("%d", &(*a).r1);
scanf("%d", &(*a).r2);
scanf("%d", &(*a).r3);
}
void print(struct Student a) {
printf("%s %s %d %d %d\n", a.num, a.name, a.r1, a.r2, a.r3);
}