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
相关产品推荐
相关产品推荐

