一、核心语法与基本用法

scanf函数支持一次从键盘读取多个输入值,并依次赋值给多个变量,是C语言中批量输入数据的核心方式。

1. 基本语法格式

scanf("格式控制串", &变量1, &变量2, ..., &变量n);
  • 格式控制串:包含多个格式声明(如%d%f%c),与后续变量一一对应,指定输入数据的类型。

  • 取地址符&每个变量前必须添加,表示将输入数据存储到该变量对应的内存地址中。这是scanf与printf最核心的区别(printf输出时不需要加&)。

2. 完整示例代码

#include <stdio.h>

int main()
{
    int i, j, k;  // 定义3个整型变量
    // 一次读取3个整数,分别赋值给i、j、k
    scanf("%d%d%d", &i, &j, &k);
    // 输出3个变量的值验证
    printf("i=%d, j=%d, k=%d\n", i, j, k);
    return 0;
}

3. 运行与输入说明

编译运行程序后,在终端输入3个整数,按回车键确认即可完成赋值。


二、输入分隔符规则

当格式控制串中仅包含格式声明(无其他普通字符)时,输入的多个数值之间必须用空白字符分隔,scanf会自动跳过任意数量的空白字符。

1. 合法分隔符

  • 空格(最常用)。

  • 回车键(Enter)。

  • 水平制表符(Tab)。

2. 输入示例(以上述代码为例)

以下3种输入方式完全等价,程序都会正确将1赋值给i、2赋值给j、3赋值给k:

  1. 空格分隔:1 2 3

  2. 回车分隔:

    1
    2
    3
  3. Tab分隔:1 2 3

3. 常见错误:连续输入无分隔符

如果输入123,scanf会将其识别为单个整数123,赋值给第一个变量i,然后继续等待输入j和k的值,此时程序会处于阻塞状态,直到输入剩余两个数值。


三、格式控制串中的非输入控制符

如果格式控制串中包含除格式声明外的普通字符(称为非输入控制符,如逗号、分号、冒号等),输入时必须在对应位置原样输入这些字符,否则会导致输入匹配失败,后续变量无法正确赋值。

1. 带非输入控制符的示例

#include <stdio.h>

int main()
{
    int i, j, k;
    // 格式控制串中包含逗号作为分隔符
    scanf("%d,%d,%d", &i, &j, &k);
    printf("i=%d, j=%d, k=%d\n", i, j, k);
    return 0;
}

2. 正确与错误输入对比

输入方式

结果说明

1,2,3

正确,i=1、j=2、k=3

1 2 3

错误,仅i=1,j和k为随机垃圾值

1,2 3

错误,仅i=1、j=2,k为随机垃圾值

3. 原理说明

scanf会严格按照格式控制串的字符序列匹配输入内容。当遇到非输入控制符时,会要求输入流中对应位置必须是完全相同的字符,否则匹配终止,后续变量不再赋值。


四、常见错误与注意事项

  1. 忘记添加取地址符&

    • 错误写法:scanf("%d%d", i, j);

    • 后果:编译可能通过,但运行时会出现段错误(程序崩溃)或赋值结果完全错误。这是scanf最常见的错误。

  2. 输入格式与控制串不匹配

    • 例如控制串为%d,%d但输入1 2,会导致第二个变量赋值失败。

    • 排查方法:严格对照格式控制串的每一个字符,确保输入完全匹配。

  3. 输入非法字符导致输入终止

    • 例如输入- 例如输入12a3%d格式会读取到12后,遇到非法字符a`立即终止输入,后续变量无法赋值。

    • 后果:未赋值的变量会保留其初始随机值。

  4. 数值类型与格式声明不匹配

    • 例如用%d读取浮点型数据,或用%f读取整型数据,会导致赋值结果完全错误。

    • 双精度浮点型变量输入时必须使用%lf格式声明(输出时可用%f)。


五、VSCode环境运行提示

  1. 在VSCode中运行程序后,输入区域会显示在终端底部,输入完成后必须按回车键确认,程序才会读取缓冲区中的数据。

  2. 如果程序处于等待输入状态,终端会显示闪烁的光标,此时输入对应格式的数据并回车即可。

  3. 若输入错误导致程序异常,可按Ctrl+C强制终止程序运行。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐