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

C语言scanf使用%5s读取超5字符输入时输出错误如何修复

C语言scanf %5s读取异常修复方案

问题原因

异常触发的核心是输入缓冲区残留字符导致后续整数读取失败:

  • %5s的作用是最多读取5个非空白字符写入目标数组,同时自动在末尾补字符串结束符\0,刚好适配你定义的长度为6的name数组,本身是避免缓冲区溢出的最佳实践
  • 当输入的name长度超过5时,超出的字符会留在输入缓冲区中没有被读取
  • 后续执行scanf("%d", &age)时,会优先读取缓冲区中残留的非数字字符,整数格式匹配失败,age变量未被正确赋值,最终输出异常
  • 你换成%s可以正常运行的本质是%s会把所有输入的name字符全部读取,缓冲区没有残留,但会存在严重的数组越界漏洞,输入过长时会直接导致程序崩溃。

修复方案(完全保留%5s用法)

只需要在两次scanf调用之间清空输入缓冲区的残留内容即可,推荐兼容性最优的实现:

#include<stdio.h>

int main(void)
{
  char name[6];
  int age;
  printf("Enter your name: ");
  scanf("%5s",name);
  // 新增:循环清空输入缓冲区直到读到换行符或输入结束
  int temp;
  while ((temp = getchar()) != '\n' && temp != EOF);
  printf("Enter your age: ");
  scanf("%d",&age);
  printf("Your name: %.4s\n",name);
  printf("Your age: %d\n",age);
  return 0;
}

方案说明

  • 新增的循环会把输入name后残留的所有字符全部读取丢弃,保证后续读取age时缓冲区为空,只会读取用户新输入的整数值
  • 完全保留了%5s的边界保护能力,不会出现数组越界风险,兼容所有C标准运行环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:06:03