You need to enable JavaScript to run this app. C语言struct关联自定义函数输出学号、手机号等长整型数值错误问题
优惠活动
大模型
产品
解决方案
定价
更多

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);

其他已知问题

  1. gets函数已被C标准废弃,存在缓冲区溢出风险,建议替换为fgets(info_s.name, STRSIZE, stdin),使用时记得手动处理字符串末尾的换行符。
  2. 日期输入的格式符不匹配,你要求用户输入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 03:15:03