有关结构体对象值的输入

img


每次总是把两个字符串输入完之后就不能输入了,然后就如下图了

img


怎么回事,谁能解释一下?

img

img

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);
}

给你个例子吧

函数按值拷贝传参啊,你可以了解一下 函数按值传参,引用传参,地址传参。
你在输入的时候,input()函数的参数是一个变量,在使用的时候是拷贝传参,内部做相关赋值动作,外部会不生效的,你是这给参数用引用或者地址传参的方式进行赋值~