如何用C语言实现数字逐位转英文拼写?现有代码死循环求修复
问题排查与修复
死循环根因
你写的第二个while(rev!=0)循环中,只提取了rev的个位数值处理,没有执行rev /= 10来移除已处理的个位,导致rev值永远不会变为0,循环无法终止。比如输入21时,反转后的rev值固定为12,每次循环都取个位2打印,自然会无限输出Two。
原代码其他缺陷
- 数字反转逻辑会丢失原数字末尾的0:比如输入320,反转后的
rev值为23,最终输出结果为Two Three,与预期的Three Two Zero不符 void main()不符合C语言标准规范,标准入口函数返回值应为int- 输出结果末尾会多余一个空格
修复方案
这里提供更稳妥的实现,直接将输入作为字符串遍历,无需处理数字反转和0丢失问题:
#include <stdio.h> int main(){ char num[32]; printf("Enter any number to print in words: "); scanf("%s", num); for (int i = 0; num[i] != '\0'; i++) { switch(num[i] - '0') { case 0: printf("Zero"); break; case 1: printf("One"); break; case 2: printf("Two"); break; case 3: printf("Three"); break; case 4: printf("Four"); break; case 5: printf("Five"); break; case 6: printf("Six"); break; case 7: printf("Seven"); break; case 8: printf("Eight"); break; case 9: printf("Nine"); break; } if (num[i+1] != '\0') printf(" "); } return 0; }
如果要保留原数字反转的思路,只需要补全rev移位逻辑,同时额外处理原数字末尾0的情况即可:
#include <stdio.h> int main(){ long int num, rev=0; int zero_count = 0; printf("Enter any number to print in words: "); scanf("%ld",&num); // 统计末尾0的数量,避免反转后丢失 while(num != 0 && num%10 == 0) { zero_count++; num /= 10; } while(num != 0){ rev = (rev*10) + (num%10); num /= 10; } while(rev != 0){ long int x = rev%10; switch(x){ case 0: printf("Zero"); break; case 1: printf("One"); break; case 2: printf("Two"); break; case 3: printf("Three"); break; case 4: printf("Four"); break; case 5: printf("Five"); break; case 6: printf("Six"); break; case 7: printf("Seven"); break; case 8: printf("Eight"); break; case 9: printf("Nine"); break; } printf(" "); // 移除已处理的个位,避免死循环 rev /= 10; } // 补回之前丢失的末尾0 for(int i=0; i<zero_count; i++) { printf("Zero"); if(i != zero_count-1) printf(" "); } return 0; }
内容的提问来源于stack exchange,提问作者Parth Rajawat
相关产品推荐
相关产品推荐

