You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:07:38