一、核心规则:格式串中空白字符的统一作用
空格、\n、\t 效果完全一样
作用:自动读取并丢弃缓冲区中所有连续空白字符,一直清空,直到遇到第一个非空白字符停止。
二、各格式符对「空白」的区别(高频考点)
1、自动跳过空白(常规)
%d、%lf、%s
自带机制:自动忽略前面所有空格、回车、Tab,不需要手动加空格。
2、不跳过空白(唯一特例)
%c
不会自动跳过任何空白
缓冲区剩什么就读什么,回车 \n、普通空格都会被当作有效字符读入。
三、% c 两种标准写法(必考)
写法 1:scanf(" %c", &ch); %c 前面加空格(刷题首选)
功能:先清空缓冲区所有残留空白,再读取有效字符。
解决痛点:上一次输入遗留回车导致 % c 直接读空、无法输入。
适用场景:输入单个字符、选项、开关字符等绝大多数场景。
写法 2:scanf("%c", &ch);(不加空格)
功能:原样读取缓冲区下一个字符
可以读到:空格、换行、Tab。
适用场景:需要逐字符解析文本、统计空格 / 换行的特殊场景。
四、致命避坑
❌ 错误写法:scanf("%c ", &ch); 空格写在 % c 后面
含义:读完字符后,强制继续吞噬后续空白,极易导致程序卡死、等待多余输入,几乎不用,考试、刷题一律禁止。
五、经典报错案例
错误代码
int a; char ch; scanf("%d", &a); scanf("%c", &ch);错误原因
输入数字按下回车后,缓冲区残留 \n
第二个 %c 直接读取残留的换行符,跳过用户输入步骤。
✅ 正确修复
scanf(" %c", &ch);