C 语言 scanf 函数详解:格式化输入、缓冲区与避坑指南
一、前言本文核心内容来自学习笔记围绕scanf的三个关键问题展开为什么变量必须取地址为什么会阻塞缓冲区残留的\n怎么处理在此基础上补充了常用格式符、返回值、常见错误与输入安全等知识点。二、核心知识点 1变量必须取地址scanf用来读取标准输入把标准输入内的内容放到某个变量空间里因此变量必须取地址。int i; scanf(%d, i); // 必须传 i而不是 i原因scanf需要把读到的值写入变量对应的内存空间只有拿到地址才能通过指针真正修改那块内存。直接传i只是传了值的副本改不到外面的i。例外读取字符串时字符数组名本身就是地址不需要加char str[20]; scanf(%s, str); // 数组名即地址三、核心知识点 2scanf 为什么会阻塞scanf会阻塞是因为标准输入缓冲区是空的。当你运行程序后光标一直闪烁、毫无反应并不是死机而是scanf在等待输入。只有输入内容并按下回车数据进入缓冲区程序才会继续执行。注意scanf需要回车才能读取值所以其实我们输入的是 值 \n。四、核心代码示例 1单类型依次读取 清空缓冲区#include stdio.h //scanf用来读取标准输入scanf把标准输入内的内容需要放到某个变量空间里因此变量必须取地址 //scanf会阻塞是因为标准输入缓冲区是空的 int main() { int i; char c; float f; scanf(%d, i); printf(i%d\n, i);//把标准缓冲区中的整型数读走了 //Scanf需要回车才能读取值所以其实我们输入的是 值\n //而把标准缓冲区中的整型数读走了没有读取\n //\n就会被下一个Scanf给读取所以需要清空缓冲区 //不然\n就会被下一个Scanf给读取无法正常执行你想要输入的值 fflush(stdin);//清空标准输入缓冲区 //在C语言中%s格式说明符会自动跳过所有前导空白字符包括换行符、空格、制表符等 //只有%c和%[格式说明符不会自动跳过前导空白字符 //其他格式说明符如%d、%f、%s等都会自动跳过前导空白字符 scanf(%c, c); printf(c%c\n, c);//输出字符变量c scanf(%f, f); printf(f%4.1f\n, f); return 0; }运行流程输入42回车缓冲区里是4 2 \nscanf(%d)读走42\n残留在缓冲区若不清理下一个scanf(%c)会把\n直接读走导致无法正常输入想要的字符fflush(stdin)清空缓冲区后%c才能读到真正的字符。运行结果五、核心知识点 3空白字符跳过规则在 C 语言中%s格式说明符会自动跳过所有前导空白字符包括换行符、空格、制表符等只有%c和%[格式说明符不会自动跳过前导空白字符其他格式说明符如%d、%f、%s等都会自动跳过前导空白字符。六、核心代码示例 2一次读取多种数据类型#include stdio.h //scanf一次读多种数据类型 int main() { int i, ret; float f; char c; ret scanf(%d %c%f, i, c, f);//ret是指scanf匹配成功的个数 %c可以读取空格 printf(i%d,c%c,f%5.2f\n, i, c, f); return 0; }运行效果输入12 A 3.14回车输出i12,cA,f 3.14。ret是scanf匹配成功的个数本例成功匹配 3 项ret 3。运行结果七、知识点 1fflush (stdin) 的争议与标准清空方案fflush在 C 标准中只对输出流有明确定义fflush(stdin)属于非标准用法。它在 Windows 的 Visual Studio 等编译器上通常有效但在 Linux / GCC 下行为未定义。推荐用标准可移植的写法清空缓冲区void clear_stdin(void) { int ch; while ((ch getchar()) ! \n ch ! EOF) ; }八、知识点 2% c 前加空格 —— 最优雅的解法既然问题出在%c不跳过空白那就在格式串里显式要求跳过scanf( %c, c); // 空格表示先跳过所有空白字符含 \n再读取字符这样连清空缓冲区的代码都省了。九、知识点 3常用格式说明符对照表表格格式符含义是否自动跳过前导空白%d十进制整数是%f/%lf单精度 / 双精度浮点是%c单个字符否%s字符串遇空白停止是%x/%o十六进制 / 八进制整数是%e科学计数法浮点是%[ ]指定字符集合否十、知识点 4scanf 的返回值与循环输入scanf返回匹配成功的项数读到文件末尾返回EOF即 -1。循环读入时一定要判断返回值否则输入不匹配会陷入死循环int a, ret; while ((ret scanf(%d, a)) ! EOF) { if (ret 1) printf(读到%d\n, a); else { /* 清空本次无效输入 */ clear_stdin(); } }十一、知识点 5常见错误汇总表格错误写法问题正确写法scanf(%d, i)忘记取地址scanf(%d, i)scanf(%d)后接scanf(%c)\n残留被%c读走清空缓冲区或scanf( %c, c)scanf(%s, str)输入过长缓冲区溢出scanf(%9s, str)忽略返回值输入不匹配时变量值不确定用ret接收并判断double 用%f类型不匹配double 用%lf十二、知识点 6输入安全性用%s读字符串务必加宽度限制防止缓冲区溢出char name[10]; scanf(%9s, name); // 最多读 9 个字符第 10 个留给 \0在 Visual Studio 中也可以用更安全的scanf_s。涉及整行输入的场景推荐用fgets替代scanf避免缓冲区状态混乱。十三、总结取地址scanf要写进变量的内存空间必须传变量名字符串数组名本身就是地址。阻塞缓冲区为空时scanf等待输入回车后缓冲区是 值 \n。残留%d、%f等只读走值\n残留%c、%[不跳过空白最容易中招。可用fflush(stdin)非标准或getchar循环清空推荐scanf( %c, c)直接跳过。返回值匹配成功个数 EOF 判断是处理输入的关键。安全%s加宽度限制防止缓冲区溢出。

相关新闻

artcraft手工艺术创作实战:从设计到批量的完整工艺拆解

artcraft手工艺术创作实战:从设计到批量的完整工艺拆解

artcraft,这个项目名字拆开看,就是 art craft,艺术与手艺的结合。我在这个行业里摸爬滚打了几年,越来越觉得纯艺术和纯手工正在快速融合,而 artcraft 这类项目恰好踩在了这个交叉点上:它不追求博物馆级别的…

2026/10/19 5:09:12 阅读更多 →
Colmap自制3DGS数据集:从图像到相机位姿的完整流程

Colmap自制3DGS数据集:从图像到相机位姿的完整流程

简介:这份源码包面向希望低成本自制3D Gaussian Splatting数据集的开发者与三维重建学习者,围绕Colmap预处理流程提供可运行的项目代码,帮助解决稀疏重建无相机轨迹、稠密点云孔洞多等常见问题。包内共12个文件,以5张jpg示例图片、…

2026/10/19 5:08:11 阅读更多 →
前端表单开发实战:从常用控件到校验提交与移动端适配

前端表单开发实战:从常用控件到校验提交与移动端适配

做前端这些年,最容易被小看的一个活就是“写表单”。很多人觉得表单不就是几个 input 加一个 button,撑死再配一个下拉框,有什么好讲的?可真到了手头那种要上线给用户登记资料、报名活动的页面,问题一个接一个冒出来&a…

2026/10/19 5:08:11 阅读更多 →

最新新闻

CSerialPort串口类2017修正版:稳定嵌入工业控制的Win32封装

CSerialPort串口类2017修正版:稳定嵌入工业控制的Win32封装

简介:这是一份面向C开发者,特别是Windows平台串口通信初学者与中级工程师的轻量级串口类封装资源。CSerialPort类经2017年最新修正,显著降低MFC依赖性,新增_AFX宏适配MFC环境,并提供纯Win32验证程序,使非MF…

2026/10/19 5:54:34 阅读更多 →
STM32+有人4G模块接入阿里云IoT完整实践指南

STM32+有人4G模块接入阿里云IoT完整实践指南

简介:本资源是一套完整的STM32嵌入式设备接入阿里云IoT平台的实战工程,面向具备C语言与STM32基础的物联网开发者及高校电子类专业学生,解决4G远程通信、云平台身份认证与双向数据交互等核心问题,适用于工业监控、智能硬件原型开发…

2026/10/19 5:54:34 阅读更多 →
Python Web应用部署实战:Docker+Nginx实现稳定上线

Python Web应用部署实战:Docker+Nginx实现稳定上线

部署Python Web应用这事儿,看起来简单,实际操作中能绊倒人的地方其实不少。本地用Flask写个Demo,起个服务跑得飞快,一旦要放到服务器上常驻运行,还要面对域名、反向代理、数据持久化、日志、自动重启这些问题&#xff…

2026/10/19 5:54:34 阅读更多 →
artcraft:面向人机协同的高精度创意控制范式

artcraft:面向人机协同的高精度创意控制范式

1. “Artcraft”不是新词,而是被低估的创作范式重启信号最近在几个设计类社区和开源项目讨论区里,“artcraft”这个词突然高频出现,但没人给它下定义。它不像“generative design”那样有明确的技术边界,也不像“digital craft”那…

2026/10/19 5:54:34 阅读更多 →
MEXA-324M汽车尾气测量仪实战全解:从原理到维修诊断

MEXA-324M汽车尾气测量仪实战全解:从原理到维修诊断

上个月,一位客户开着他那辆快十年的老车进店,说年检没过,单子上写着HC超标。他问了好几家店,有人说换火花塞,有人说洗喷油嘴,折腾了一圈回来复检还是不行。我们师傅把MEXA-324M尾气测量仪的探头往排气管里一…

2026/10/19 5:54:34 阅读更多 →
Diagram as Code:用可执行图表构建系统逻辑骨架

Diagram as Code:用可执行图表构建系统逻辑骨架

1. 项目概述:这不是画图,是构建可执行的系统逻辑骨架“diagram-design”这个标题乍看像一个设计类工具操作,但在我过去十年带过的几十个跨领域项目里,它从来不是美术课——而是工程师、产品负责人、运维人员和业务方坐在一起&…

2026/10/19 5:53:33 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →