各位帮看看问题出在哪里吧?

img


img


每次总是把两个字符串输入完之后,接下来的整数就不能输入了,就如下图了

img

因为前面 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);
}