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

C语言调用结构体成员信息显示函数输出乱码的原因是什么

异常原因分析
  • 核心原因:值传递导致修改未作用于原始结构体
    你定义的enter_details函数采用值传递方式传入结构体参数,函数运行时会创建一个main函数中d1对象的临时拷贝,所有录入操作都只修改这个临时拷贝的内容。函数运行结束后临时拷贝自动销毁,main中的原始d1对象没有被写入任何有效数据,存储的仍是栈内存的初始随机值,所以调用show_details时会输出乱码。
    解决方法:将enter_details的参数改为结构体指针,传入原始对象的地址操作:
void enter_details(details *d1)
{
    printf("Enter your name: ");
    gets(d1->name);
    printf("Enter your country: ");
    gets(d1->country);
    printf("Enter your age: ");
    scanf("%d", &d1->age);
    printf("Enter your height (in meters): ");
    // 注意此处原代码格式符错误,float类型需用%f读取
    scanf("%f", &d1->height);
    // 处理scanf残留的换行符,避免后续输入逻辑出错
    while(getchar() != '\n');
}

调用时传入地址即可:enter_details(&d1);

  • 其他隐含错误
    1. 身高读取格式不匹配:height是float类型,原代码用%d格式符读取会导致数据解析错误,需要替换为%f。
    2. gets函数已被C标准正式废弃,存在缓冲区溢出漏洞,建议替换为fgets,示例用法:
    fgets(d1->name, sizeof(d1->name), stdin);
    // 移除fgets读取到的末尾换行符
    d1->name[strcspn(d1->name, "\n")] = '\0';
    

内容的提问来源于stack exchange,提问作者LordObnoxious

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:30:01