scanf无法读取结构体内部数据问题求助
解决scanf无法读取输入的问题
嘿,我帮你排查下这个scanf读取失败的问题!你说不管输入什么程序输出都一致,大概率是scanf根本没正确把输入写到变量里,导致变量一直是初始的垃圾值或者默认值,所以输出没变化。结合你给出的代码片段,我猜大概率是这几个常见坑:
最可能的问题:格式符不匹配
你定义的是double类型的坐标,但如果scanf里用了%f而不是%lf,那肯定会读取失败!因为%f是给float用的,double对应的scanf格式符必须是%lf,这是新手最容易踩的坑。
第二个常见坑:没传变量的地址
scanf要求传入变量的内存地址才能修改它的值,如果你写的是scanf("%lf", new_rect.pt1.x)而不是&new_rect.pt1.x,那相当于传了一个随机的数值进去,scanf根本不知道要把输入写到哪里,变量自然不会变。
第三个可能:结构体成员引用错误
你之前定义了全局的pt1,pt2,但在main里如果用的是struct rect new_rect,那你要修改的是new_rect.pt1.x而不是全局的pt1.x,如果搞混了,那你输入的内容都写到全局变量里了,但输出的是结构体里的成员,结果自然还是初始值。
给你一个修正后的完整示例代码,你可以参考:
#include <stdio.h> // 先定义point结构体 struct point{ double x; double y; }; // rect结构体包含四个point成员 struct rect{ struct point pt1; struct point pt2; struct point pt3; struct point pt4; }; int main() { struct rect new_rect; // 定义一个rect类型的变量 printf("请输入四个点的坐标(格式:x1 y1 x2 y2 x3 y3 x4 y4):\n"); // 注意:每个参数都要加&,格式符用%lf,正确引用结构体成员 int read_count = scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &new_rect.pt1.x, &new_rect.pt1.y, &new_rect.pt2.x, &new_rect.pt2.y, &new_rect.pt3.x, &new_rect.pt3.y, &new_rect.pt4.x, &new_rect.pt4.y); // 可以加个检查,看看有没有读取到8个值 if (read_count != 8) { printf("输入错误!只读取到%d个有效数值\n", read_count); return 1; } // 输出验证 printf("\n你输入的四个点坐标:\n"); printf("pt1: (%.2lf, %.2lf)\n", new_rect.pt1.x, new_rect.pt1.y); printf("pt2: (%.2lf, %.2lf)\n", new_rect.pt2.x, new_rect.pt2.y); printf("pt3: (%.2lf, %.2lf)\n", new_rect.pt3.x, new_rect.pt3.y); printf("pt4: (%.2lf, %.2lf)\n", new_rect.pt4.x, new_rect.pt4.y); return 0; }
最后再给你几个检查步骤:
- 逐个核对scanf里的格式符:所有
double变量必须对应%lf - 检查每个scanf参数:是不是都加了
&(如果是指针变量就不用,但这里是普通double成员,必须加) - 确认你操作的是正确的变量:是结构体里的成员,不是全局的同名变量
- 可以用scanf的返回值排查问题:它会返回成功读取的变量个数,如果不是8,说明输入格式不对或者读取失败
内容的提问来源于stack exchange,提问作者Milo
相关产品推荐
相关产品推荐

