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);
- 其他隐含错误
- 身高读取格式不匹配:
height是float类型,原代码用%d格式符读取会导致数据解析错误,需要替换为%f。 gets函数已被C标准正式废弃,存在缓冲区溢出漏洞,建议替换为fgets,示例用法:
fgets(d1->name, sizeof(d1->name), stdin); // 移除fgets读取到的末尾换行符 d1->name[strcspn(d1->name, "\n")] = '\0'; - 身高读取格式不匹配:
内容的提问来源于stack exchange,提问作者LordObnoxious
相关产品推荐
相关产品推荐

