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

C语言初学者求助:如何将5位邮政编码数字转为文本输出?

C语言实现5位邮政编码转文本的思路与代码修正

现有代码的几个问题

  • 用int存储邮编存在缺陷:如果用户输入带前导零的合法邮编(比如01234),会被当成1234处理,不仅丢失前导零,位数判断也会出错。
  • 位数判断时修改了userIn的值:循环里的userIn /= 10会破坏原输入的数字,导致后续无法拆分每一位来转文本。

数字转文本的核心思路

  1. 改用字符串存储输入:直接读取字符串,既能快速判断长度是否为5,又能保留每一位的原始值(包括前导零),处理起来更灵活。
  2. 建立数字-文本映射表:用字符串数组把0-9对应成英文单词,比如const char *num_words[] = {"Zero", "One", ..., "Nine"},通过数字索引就能直接拿到对应文本,比switch-case写法简洁高效。
  3. 逐个处理字符:遍历字符串的每个字符,把字符转成对应的整数(比如digit = input[i] - '0',利用ASCII码连续的特性),再通过映射表输出对应的单词。

修正后的完整代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    char zip[6]; // 5位数字+字符串结束符'\0'
    int valid;

    // 循环获取输入,直到符合要求
    do {
        valid = 1;
        printf("Enter a 5-digit zip code: \n");
        scanf("%s", zip);

        // 检查输入长度是否为5
        if (strlen(zip) != 5) {
            printf("You entered %zu digits, please enter exactly 5 digits.\n", strlen(zip));
            valid = 0;
            continue;
        }

        // 检查每一位是否都是数字
        for (int i = 0; i < 5; i++) {
            if (!isdigit(zip[i])) {
                printf("Invalid input! Please enter only digits.\n");
                valid = 0;
                break;
            }
        }
    } while (!valid);

    // 数字转文本输出
    const char *num_words[] = {"Zero", "One", "Two", "Three", "Four", 
                               "Five", "Six", "Seven", "Eight", "Nine"};
    printf("Zip code in text: ");
    for (int i = 0; i < 5; i++) {
        int digit = zip[i] - '0';
        printf("%s ", num_words[digit]);
    }
    printf("\n");

    return 0;
}

代码说明

  • 用char zip[6]存储输入,确保能容纳5位数字和字符串结束符。
  • 循环内先检查长度,再校验每一位是否为数字,确保输入完全合法。
  • 数字转文本时,利用字符ASCII码的连续性,通过zip[i] - '0'快速将字符转为对应整数,再通过映射数组直接输出对应单词。

内容的提问来源于stack exchange,提问作者dponce1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:05:16