一、基础语法与常见错误 #
scanf 函数的基本格式为:
scanf("格式控制字符串", 地址表列);
经典错误示例:
// 正确:取地址符 & 不可少
scanf("%f%f%f", &a, &b, &c);
// 错误:缺少 &,程序可能崩溃!
scanf("%f%f%f", a, b, c);
二、格式字符串的严格性 #
禁止添加多余字符:
// 错误:格式字符串中的 \n 会导致输入阻塞
scanf("%d,%f\n", &a, &b);
输入时需要完全匹配格式字符串。例如输入 5,3.14 后,若格式字符串末尾有 \n,必须再输入一个任意字符才能结束。
禁止使用精度控制:
// 错误:scanf不支持%m.nf格式!
scanf("%7.2f", &a);
直接使用 %f 或 %lf 即可。
三、输入分隔符的匹配规则 #
**示例 1:逗号分隔符** #
scanf("a=%f,b=%f,c=%f", &a, &b, &c);
- ✅ 正确输入:
a=1,b=3,c=2 - ❌ 错误输入:
1 3 2(缺少逗号)或a=1 b=3 c=2(用空格替代逗号)
**示例 2:冒号与空格混合分隔** #
scanf("a=%f: b=%f: c=%f", &a, &b, &c);
- ✅ 正确输入:
a=1: b=3: c=2(严格匹配冒号和空格)
四、字符与数值输入的差异 #
| 输入类型 | 分隔符要求 | 示例 |
|---|---|---|
| 字符 | 无需分隔符 | abc → a='a', b='b', c='c' |
| 数值 | 必须用空格/分隔符区分 | 12 34 → a=12, b=34 |
推荐写法:显式指定分隔符
// 输入格式:1,2,3
scanf("%d,%d,%d", &a, &b, &c);
五、字符输入的致命陷阱 #
问题场景:
scanf("%c", &ch); // 输入回车后,ch会读取到'\n'
解决方案:
- 过滤回车符:
if (ch == '\n') ch = getchar(); // 手动跳过
- 强制添加分隔符:
scanf("%c,", &ch); // 输入时必须带逗号:a, b, c
六、浮点类型的隐藏雷区 #
必须严格区分:
float→%fdouble→%lf
底层原理:
float为 4 字节,double为 8 字节。scanf通过指针直接操作内存,若格式符错误会导致:- ❌
%lf读取float:内存溢出(覆盖相邻数据) - ❌
%f读取double:数据截断(后 4 字节未初始化)
- ❌
代码验证:
float f;
double d;
scanf("%f", &f); // 正确
scanf("%lf", &d); // 正确
总结表格速查 #
| 问题类型 | 正确写法 | 错误写法 | 后果 |
|---|---|---|---|
| 取地址符 | scanf("%d", &a); |
scanf("%d", a); |
程序崩溃 |
| 格式字符串匹配 | scanf("a=%d", &a); |
输入不带 a= |
输入阻塞/数据错误 |
| 浮点类型 | float→%f, double→%lf |
混用格式符 | 内存越界/数据截断 |
| 字符输入 | scanf(" %c", &ch); |
直接 %c 无空格 |
读取残留回车符 |
