为什么long int类型在Turbo C中存储11-12位手机号无法正常工作?
问题原因及修复方案
1. 手机号存储异常的核心原因
Turbo C是16位DOS时代的编译器,内置整数类型长度和现代32/64位编译器完全不同:
- 16位环境下
long int仅占4字节,取值范围是-2147483648 ~ 2147483647,最大值才10位,完全存不下11位的手机号 - 哪怕是
unsigned long int最大值也只有4294967295,同样是10位,不够存11位号码
2. 手机号存储方案选择
推荐两种适配Turbo C的方案:
- 方案一:改用
char数组存储(最优)
手机号不需要参与数值计算,用字符串存储更合理,还能兼容带+号、区号等特殊格式的号码,修改结构体定义即可:
struct PBEntry { struct Name name; struct Address address; int age; char mobile[13]; // 12位号码+1位结束符 };
对应的输入输出改为%s格式符即可:
// 输入 scanf("%s", pb[SIZE].mobile); // 输出 printf("Phone number: %s\n", p[i].mobile);
- 方案二:改用
long long类型(Turbo C 3.0及以上版本支持)
如果必须用数值类型存储,可声明为long long mobile,输入输出用%lld格式符,取值范围可以覆盖19位以内的整数,足够存12位手机号。
3. 代码其他适配Turbo C的修复点
你贴的代码还有几个Turbo C下运行的问题需要一并修改:
- 缺失头文件:
clrscr()、getch()、exit()需要引入对应头文件,在代码最开头添加:
#include <conio.h> #include <stdlib.h>
gets()输入缓冲区残留问题:scanf()读取数字后会在缓冲区留下换行符,后续gets()会直接读空行,每次scanf()后需要手动清空缓冲区,比如加一行fflush(stdin);case 2缺少break:编辑条目后会直接落到case 3执行显示逻辑,需要在c++;后面加break;- 函数未前置声明:
printMenu()函数调用前没有声明,在main()之前添加声明int printMenu(); showAll函数逻辑错误:函数内定义的edit数组是局部未初始化的,c变量也是局部的初始值永远是0,原来的判断逻辑完全无效,直接删除冗余的if(c>0)分支和edit相关定义即可。
内容的提问来源于stack exchange,提问作者PABLO1403
相关产品推荐
相关产品推荐

