C语言struct关联自定义函数输出学号、手机号等长整型数值错误问题
问题根因
你遇到的输出异常本质是有符号整数溢出,属于C语言的未定义行为:
- 32位编译环境下
long int类型占4字节,合法取值范围为[-2147483648, 2147483647],你录入的手机号(如5554443330、9998887770)、长学号均超过了最大值限制,存储时发生溢出,就会出现输出乱码、负数、随机值的问题。 - 单条数据正常是因为你输入的数值刚好落在
long int合法范围内,多条时数值超范围就触发了问题。
修复方案
方案1:更换大整数类型
把结构体中存储学号、手机号的字段类型从long int替换为long long int,同步修改读写的格式符即可:
// 结构体定义修改 struct company { char Co_Intern[STRSIZE]; long long int Co_Tel; }; struct student { long long int ID; char name[STRSIZE]; long long int Tel; // 其余字段不变 }; // GetData函数中输入格式符修改 scanf("%lld", &info_s.ID); scanf("%lld", &info_s.Tel); scanf("%lld", &info_s.COE.Co_Tel); // print_info函数中输出格式符修改 printf("Student ID: %lld", STU[i].ID); printf("Student Telephone number: %lld", STU[i].Tel); printf("Company's Telephone: %lld", STU[i].COE.Co_Tel);
方案2:改用字符串存储(更推荐)
学号、手机号本身不需要参与数值运算,用字符串存储兼容性更强,可兼容带前导0的学号、带特殊符号的手机号等场景:
// 结构体定义修改 #define NUM_LEN 20 struct company { char Co_Intern[STRSIZE]; char Co_Tel[NUM_LEN]; }; struct student { char ID[NUM_LEN]; char name[STRSIZE]; char Tel[NUM_LEN]; // 其余字段不变 }; // 输入输出直接用%s即可 scanf("%s", info_s.ID); printf("%s", STU[i].ID);
其他已知问题
gets函数已被C标准废弃,存在缓冲区溢出风险,建议替换为fgets(info_s.name, STRSIZE, stdin),使用时记得手动处理字符串末尾的换行符。- 日期输入的格式符不匹配,你要求用户输入
dd-mm-yyyy格式,但当前scanf("%d%d%d")无法识别中间的-分隔符,会导致日期读取错误,建议修改为:
scanf("%d-%d-%d", &info_s.doj.dd, &info_s.doj.mm, &info_s.doj.yyyy);
输出日期时也建议补充%d-%d-%d格式,提升可读性。
内容的提问来源于stack exchange,提问作者Rosha. R
相关产品推荐
相关产品推荐

