C语言实现5位数字转单词及输入校验无限循环问题解决
问题1:无限循环的原因及修复
- 核心原因1:仅在首次输入后计算了一次位数
count,后续重新输入新的邮政编码后没有重新计算count值,导致count一直保留首次计算结果,永远无法满足退出循环的条件。 - 核心原因2:计算位数时直接修改了原始输入的
ac变量,就算后续输入合法,也丢失了原始输入值,无法进行后续转单词操作。 - 额外可优化点:拼写错误
intered应为entered,末尾的空while(count == 5)属于死循环,无实际作用可直接删除。
问题2:数字转英文单词的实现思路
- 提前定义映射数组:用下标对应0-9的数字,数组值存储对应数字的英文单词,后续直接通过下标取值即可完成映射。
- 逐位取数:对合法的5位数字,从最高位(万位)到最低位(个位)依次取出每一位的单独数值。
- 按位输出:根据取出的数字下标从映射数组中取对应单词输出,单词间用空格分隔。
完整可运行代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { int ac, count; // 0-9对应英文单词的映射数组 char *digit_words[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; // 输入校验循环 while (1) { printf("Enter a 5 digit area code: "); scanf("%d", &ac); // 用临时变量计算位数,不修改原始ac的值 count = 0; int temp = ac; // 兼容负数输入的情况 if (temp < 0) temp = -temp; do { temp /= 10; count++; } while (temp != 0); if (count != 5) { printf("You entered %d digits.\n", count); } else { // 输入为合法5位数字,退出校验循环 break; } } // 5位数字逐位转单词输出,从万位开始取数 int divisor = 10000; for (int i = 0; i < 5; i++) { int current_digit = ac / divisor % 10; printf("%s ", digit_words[current_digit]); divisor /= 10; } printf("\n"); return 0; }
内容的提问来源于stack exchange,提问作者jr32323
相关产品推荐
相关产品推荐

