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

C语言结构体char数组使用scanf输入后输出异常问题求助

问题原因
  • 字符串缓冲区未预留结束符空间:C语言中字符串以\0作为结束标记,你定义的firstname、lastname数组长度均为10,使用scanf("%10s", ...)读取时,会最多读取10个非空白字符,再自动追加1个\0,总共需要11字节存储空间,必然发生缓冲区溢出。溢出的\0会被写入紧挨着firstname内存地址的lastname数组的首字节位置。
  • fflush(stdin)属于未定义行为:C标准仅规定fflush对输出流的处理逻辑,针对输入流调用fflush的效果完全由编译器决定。你当前环境下fflush(stdin)生效清空了输入缓冲区中第一次输入剩余的A,后续输入27个B时,scanf("%10s", omayma.lastname)会读取10个B写入lastname数组,直接覆盖了之前溢出写在lastname[0]的\0。
  • puts输出逻辑导致越界:puts会持续输出字符直到遇到\0才停止,此时firstname数组内只有10个A,没有结束符\0,因此输出完10个A后会继续读取相邻lastname数组的内容,直到lastname末尾的\0才终止,也就出现了firstname输出10个A加10个B的现象。
修复方案
  1. 调整数组长度,预留结束符空间:如果需要存储10个有效字符,将数组长度改为11即可
typedef struct
{
    char firstname[11];
    char lastname[11];
} person;
  1. 替换不可移植的fflush(stdin),使用标准兼容的方式清空输入缓冲区:
// 每次scanf后执行以下代码清空输入缓冲区
int c;
while ((c = getchar()) != '\n' && c != EOF);
  1. 若需要严格限制输出长度,可使用printf指定最大输出位数,避免依赖字符串结束符:
// 最多输出10个字符
printf("%.10s\n", omayma.firstname);
printf("%.10s\n", omayma.lastname);

内容的提问来源于stack exchange,提问作者Omayma Benali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:15:02