一、基础语法与常见错误 #

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(严格匹配冒号和空格)

四、字符与数值输入的差异 #

输入类型 分隔符要求 示例
字符 无需分隔符 abca='a', b='b', c='c'
数值 必须用空格/分隔符区分 12 34a=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%f
  • double%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 无空格 读取残留回车符