C语言初学者求助:如何将5位邮政编码数字转为文本输出?
C语言实现5位邮政编码转文本的思路与代码修正
现有代码的几个问题
- 用
int存储邮编存在缺陷:如果用户输入带前导零的合法邮编(比如01234),会被当成1234处理,不仅丢失前导零,位数判断也会出错。 - 位数判断时修改了
userIn的值:循环里的userIn /= 10会破坏原输入的数字,导致后续无法拆分每一位来转文本。
数字转文本的核心思路
- 改用字符串存储输入:直接读取字符串,既能快速判断长度是否为5,又能保留每一位的原始值(包括前导零),处理起来更灵活。
- 建立数字-文本映射表:用字符串数组把0-9对应成英文单词,比如
const char *num_words[] = {"Zero", "One", ..., "Nine"},通过数字索引就能直接拿到对应文本,比switch-case写法简洁高效。 - 逐个处理字符:遍历字符串的每个字符,把字符转成对应的整数(比如
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
相关产品推荐
相关产品推荐

