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

C语言数字转单词程序异常输出问题求助

嘿,这个问题我太熟了!咱们先搞清楚为啥会多出来那行nb = ZERO,然后一步步解决它~

问题根源:输入缓冲区的换行符在搞鬼

你用scanf("%c", &nb[0])读取字符的时候,它会读取输入缓冲区里的所有字符,包括你输入数字后按下的回车(\n)。咱们走一遍实际运行的流程:

  1. 第一次输入5然后回车,此时输入缓冲区里是'5' + '\n';
  2. 第一次scanf读取了'5',处理后输出FIVE;
  3. 进入第二次循环,scanf直接读取了缓冲区里剩下的'\n';
  4. 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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:43:11