C语言char二维字符串数组printf打印输出与预期不符问题求解
C语言字符串数组输出异常原因分析
核心问题
二维字符数组的第二维长度分配不足,导致部分字符串无法存储末尾的\0结束符,触发printf("%s")的未定义行为。
原理说明
C语言中的字符串以\0作为隐式结束标记,printf输出%s类型时,会从给定的起始地址持续读取内存内容,直到遇到\0才会终止输出:
- 你定义的数组为
char s[9][5],每个元素最多只能容纳4个有效字符 + 1个\0结束符 - 字符串列表中的
three、seven、eight的有效字符长度均为5,没有多余空间存储\0,因此内存中这三个字符串会和后续相邻的字符串内容连为一体
异常输出对应逻辑
完全匹配你得到的错误输出:
s[2]对应字符串three,无结束符,会连续读取后续s[3]的four直到遇到four的结束符,输出threefours[3]到s[5]对应four、five、six,有效字符长度均不超过4,能正常存储\0,输出正常s[6]对应字符串seven,无结束符,会连续读取后续s[7]的eight、s[8]的nine直到遇到nine的结束符,输出seveneightnines[7]对应字符串eight,无结束符,会连续读取后续s[8]的nine直到遇到结束符,输出eightnines[8]对应字符串nine,有效字符长度为4,能正常存储\0,输出正常
修复方案
两种方案任选即可:
- 调大二维数组的第二维长度到至少6:
char s[9][6]={"one","two","three","four","five","six","seven","eight","nine"};
- 改用指针数组,无需手动计算字符串长度:
char *s[9]={"one","two","three","four","five","six","seven","eight","nine"};
内容的提问来源于stack exchange,提问作者Praj
相关产品推荐
相关产品推荐

