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

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的结束符,输出threefour
  • s[3]到s[5]对应four、five、six,有效字符长度均不超过4,能正常存储\0,输出正常
  • s[6]对应字符串seven,无结束符,会连续读取后续s[7]的eight、s[8]的nine直到遇到nine的结束符,输出seveneightnine
  • s[7]对应字符串eight,无结束符,会连续读取后续s[8]的nine直到遇到结束符,输出eightnine
  • s[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:48:04