C语言数字转单词程序异常输出问题求助
嘿,这个问题我太熟了!咱们先搞清楚为啥会多出来那行nb = ZERO,然后一步步解决它~
问题根源:输入缓冲区的换行符在搞鬼
你用scanf("%c", &nb[0])读取字符的时候,它会读取输入缓冲区里的所有字符,包括你输入数字后按下的回车(\n)。咱们走一遍实际运行的流程:
- 第一次输入
5然后回车,此时输入缓冲区里是'5'+'\n'; - 第一次
scanf读取了'5',处理后输出FIVE; - 进入第二次循环,
scanf直接读取了缓冲区里剩下的'\n'; atoi(nb)把'\n'转换成了整数0,所以就输出了ZERO,然后又进入下一次循环等待输入。
解决办法:跳过空白字符
最简单的修复方式是在scanf的格式字符串里给%c前面加一个空格,让它自动跳过所有空白字符(包括换行、空格、制表符):
scanf(" %c", &nb[0]);
这个空格的作用是告诉scanf:先忽略所有空白字符,直到遇到第一个非空白字符再读取。
额外优化:增加输入合法性判断(可选)
另外,你的代码现在如果输入非数字也非#的字符(比如字母a),atoi也会返回0输出ZERO,可以加个判断让程序更健壮:
#include <stdlib.h> #include <stdio.h> int main() { // 建议用int main而不是void main,符合C语言标准 char tableau[10][6] = {"ZERO","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"}; // THREE是5个字符,数组长度设6更安全(留字符串结束符'\0'的位置) char nb; // 没必要用数组,单个char变量就足够 while (1) { printf("nb = "); scanf(" %c", &nb); if (nb == '#') { break; // 输入#时退出循环 } if (nb >= '0' && nb <= '9') { int num = nb - '0'; // 直接通过字符ASCII值差转数字,比atoi更高效 printf("%s\n", tableau[num]); } else { printf("请输入0-9的数字或#结束程序\n"); } } return 0; }
这里做了几个实用小优化:
- 把
void main()改成标准的int main(),符合C语言规范; - 用单个
char nb代替数组,代码更简洁; - 直接用
nb - '0'把字符转数字,比调用atoi函数更高效; - 增加输入合法性判断,避免非法输入导致的错误输出;
- 调整了
tableau的第二个维度为6,给字符串结束符留足空间(原来的5也能工作,但留余量更安全)。
内容的提问来源于stack exchange,提问作者MiTiX_
相关产品推荐
相关产品推荐

