You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:09:33