C语言字符传递函数:不完整邮编校验代码解析与技术咨询
解析与补全:提取数字并校验邮编的C语言函数
咱们先拆解下这段未完成的代码逻辑:它的目标是从任意输入字符串里提取所有数字字符,然后校验这些数字是否符合5位邮编的格式要求。目前代码已经完成了数字提取的部分,但邮编长度校验的分支逻辑没写完,还有几个小细节可以优化。
原代码的现有逻辑分析
原代码的核心流程是:
- 遍历输入字符串
str,把每个数字字符筛选出来存入tel数组(这里变量名其实改成zipcode更贴合功能,后面我会调整) - 给提取后的数字数组加上字符串结束符
'\0' - 已经处理了“提取的数字不足5位”的错误提示,但缺少长度等于5(合法)和超过5位(非法)的处理分支
补全+优化后的完整代码
#include <stdio.h> #include <string.h> #define SIZE 200 void check(char str[]); void check(char str[]) { /* 检查输入的字符是否为数字,提取到邮编数组 */ int i; int j = 0; // 邮编是5位,加结束符需要6个位置,避免数组越界 char zipcode[6]; for(i = 0; str[i] != '\0'; i++) { if(str[i] >= '0' && str[i] <= '9') { // 提前判断是否超过5位,防止数组溢出 if(j < 5) { zipcode[j++] = str[i]; } } } zipcode[j] = '\0'; // 确保字符串正确终止 /* 检查邮编长度是否符合要求 */ int zip_len = strlen(zipcode); if(zip_len < 5) { printf("Not enough digits on input!\n"); } else if(zip_len == 5) { printf("Valid zip code: %s\n", zipcode); } else { printf("Too many digits on input! Expected 5, got %d\n", zip_len); } } // 可以加个主函数测试 int main() { char input[SIZE]; printf("Enter a string containing zip code: "); fgets(input, SIZE, stdin); // 去掉fgets读取的换行符 input[strcspn(input, "\n")] = '\0'; check(input); return 0; }
关键优化与补全说明
- 数组大小调整:把原
tel[10]改成zipcode[6],因为5位邮编加结束符正好需要6个存储空间,既节省内存又能避免不必要的数组溢出风险。同时在提取数字时加了j < 5的判断,防止超过5位的数字写入数组导致溢出。 - 补全分支逻辑:新增了长度等于5的合法分支(输出有效邮编),以及长度超过5的错误分支(提示数字过多)。
- 变量命名优化:把
tel改成zipcode,让代码可读性更强,一眼就能看出变量用途。 - 新增测试主函数:添加了
main函数方便直接测试,用fgets读取输入更安全,还处理了换行符的问题。 - 提前计算长度:把
strlen(zipcode)的结果存在zip_len变量里,避免多次调用函数浪费性能。
内容的提问来源于stack exchange,提问作者J Pham
相关产品推荐
相关产品推荐

