C语言不使用额外函数分割注册码提取批次号与e number问题
问题分析与修复方案
核心问题点
- 字符串缓冲区未预留空终止符位置:C语言字符串需要以
\0结尾才能被printf("%s")正确识别,你当前定义的batchNo[2]仅能存储2位字符,没有多余空间存终止符,eNO[3]同理,会导致输出时越界访问内存出现乱码。 - 拆分完成后未手动添加字符串终止符:即使扩大缓冲区,你当前的赋值逻辑仅填充了数字位,没有主动给两个目标数组末尾加
\0,同样会触发字符串读写越界。 - 输入读取存在溢出风险:
scanf("%s", enumber)没有限制输入长度,当用户输入超过8位字符时会溢出enumber的9字节缓冲区。 - 循环逻辑冗余:注册码是固定
M/XX/XXX格式,不需要循环判断位置,直接按索引取值即可,避免逻辑出错。
修复后代码
#include <stdio.h> int main() { char enumber[9]; char batchNo[3]; // 2位批次号+1位终止符 char eNO[4]; // 3位e number+1位终止符 printf("Enter the Registration Number: "); // 限制输入长度避免缓冲区溢出 scanf("%8s", enumber); printf("输入的注册码:%s\n", enumber); // 按固定格式拆分批次号(索引2、3位) batchNo[0] = enumber[2]; batchNo[1] = enumber[3]; batchNo[2] = '\0'; // 手动添加字符串终止符 // 拆分e number(索引5、6、7位) eNO[0] = enumber[5]; eNO[1] = enumber[6]; eNO[2] = enumber[7]; eNO[3] = '\0'; // 手动添加字符串终止符 printf("批次号:%s\n", batchNo); printf("e number:%s\n", eNO); return 0; }
内容的提问来源于stack exchange,提问作者Rasathurai Karan
相关产品推荐
相关产品推荐

