C语言结构体传参问题:输入函数数据无法被显示函数读取
解决结构体输入后无法显示内容的常见问题
嘿,我猜你大概率是踩了结构体传值 vs 传引用的坑——这是新手练结构体时最容易犯的错误之一!下面我结合代码示例给你讲清楚问题出在哪,以及怎么修复:
最常见的问题:传值导致修改的是副本
当你把结构体直接传递给输入函数时,函数内部会创建一个结构体的副本,你输入的所有内容都存在这个副本里。等函数执行完,副本就被销毁了,原来的结构体根本没被修改,所以调用显示函数时自然看不到你输入的信息。
错误代码示例
#include <stdio.h> // 声明结构体 typedef struct { char name[50]; int age; } Person; // ❌ 错误:按值传递结构体,修改的是副本 void inputPerson(Person p) { printf("请输入姓名:"); scanf("%s", p.name); printf("请输入年龄:"); scanf("%d", &p.age); } void showPerson(Person p) { printf("\n姓名:%s\n年龄:%d\n", p.name, p.age); } int main() { Person user; inputPerson(user); // 这里传递的是user的副本 showPerson(user); // 原user没被修改,显示空/垃圾值 return 0; }
修复方案:用指针传递(修改原结构体)
要让输入函数真正修改你定义的结构体,需要传递结构体的地址(也就是用指针),这样函数就能直接操作原结构体的内存空间了。
正确代码示例
#include <stdio.h> typedef struct { char name[50]; int age; } Person; // ✅ 正确:传递结构体指针,直接修改原结构体 void inputPerson(Person *p) { printf("请输入姓名:"); scanf("%s", p->name); // 指针用->访问结构体成员 printf("请输入年龄:"); scanf("%d", &p->age); } void showPerson(Person p) { printf("\n姓名:%s\n年龄:%d\n", p.name, p.age); } int main() { Person user; inputPerson(&user); // 传递user的地址 showPerson(user); // 现在能正常显示输入的内容啦 return 0; }
额外小提示(针对特殊场景)
如果需要输入带空格的姓名(比如"John Doe"),scanf("%s")会在空格处截断输入,这时候可以换成fgets:
// 替换输入姓名的代码 fgets(p->name, sizeof(p->name), stdin); // 注意:fgets会把换行符也读进去,需要手动去掉 p->name[strcspn(p->name, "\n")] = '\0';
内容的提问来源于stack exchange,提问作者Eric Michael Fadriga
相关产品推荐
相关产品推荐

