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

C语言数字转英文单词程序输出异常原因排查求助

C语言字符串数组输出异常问题分析

问题背景

需求:编写程序处理正整数n,1≤n≤9时输出对应小写英文单词,n>9时输出“Greater than 9”。

提供的代码如下:

#include <stdio.h>
#include <string.h>

int main()
{
    int n;
    scanf("%d", &n);
    
    char keySet[9][5] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    
    if (n > 9)
    {
        printf("Greater than 9");
    }
    else
    {
        n -= 1;
        puts(keySet[n]);
    }
}

异常现象:输入8时输出“eightnine”(期望为“eight”),输入7时输出“seveneightnine”,仅长度为5的字符串(如three、seven)出现该问题。

尝试:将keySet定义为char keySet[9][6]时程序运行正常,定义为[9][5]则异常,求助该问题的原因。

问题原因

这是C语言字符串的终止符规则导致的:

  • C语言中的字符串必须以'\0'(空字符)作为结束标记,puts()这类字符串输出函数会从起始地址开始读取字符,直到遇到'\0'才停止。
  • 观察数组中的字符串:"three"、"seven"、"eight"、"nine"都是5个字符长度,当你定义char keySet[9][5]时,每个子数组只有5个字节的空间,刚好只能放下这5个字符,没有多余的空间存储'\0'。
  • C语言中字符串数组初始化时,如果没有足够空间存放'\0',编译器不会自动添加这个终止符。此时puts()输出时会越界读取后续内存中的内容,直到在某个位置遇到'\0',所以会把后面相邻的字符串也一并输出(比如输出"eight"时会接着读后面的"nine")。
  • 当把数组定义改为char keySet[9][6]时,每个子数组有6个字节的空间,5个字符加上'\0'刚好填满,puts()能正确识别字符串的结束位置,输出就正常了。

内容的提问来源于stack exchange,提问作者Vaibhav Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:35:41