12 scanf和printf

正在加载视频播放器…

GESP C++ 一级:scanf 与 printf 精讲

核心目标:掌握 C 风格输入输出函数 scanf 和 printf 的基本用法、格式控制符,理解与 cin/cout 的区别,能正确读写整数、浮点数、字符。
scanf 读数据要加 &,printf 输出要写格式符;double 在 scanf 中用 %lf,在 printf 中用 %f 或 %.2f。

一、什么是 scanf 和 printf

GESP 一级考纲明确要求掌握基础的 cin、scanf、cout、printf 语句。C++ 提供了两套完整的输入输出方式:

方式 来源 头文件 特点
cin / cout C++ <iostream> 自动识别类型,写起来简单
scanf / printf C <cstdio> 格式化控制强,大数据时更快

scanf 和 printf 在格式化输出方面更灵活,比如保留指定小数位数,用 printf 写起来很直观。一级考试中两种方式都可能出现,需要都能读懂、会写。

使用前需要包含头文件:

#include <cstdio>
using namespace std;

二、printf 输出

1. 基本语法

printf("格式字符串", 变量1, 变量2, ...);
  • 格式字符串用双引号,里面可以写普通文字和格式控制符。
  • 格式控制符以 % 开头,按顺序对应后面的变量。
  • 变量个数和类型要和格式控制符一一对应。

示例:

int a = 10;
printf("a = %d\n", a);

输出:

a = 10

2. 常用格式控制符

控制符 对应类型 说明 示例
%d int 十进制整数 printf("%d", 123);
%lld long long 长整数 printf("%lld", 123LL);
%f float / double 浮点数,默认保留 6 位小数 printf("%f", 3.14);
%.2f 保留 2 位小数 printf("%.2f", 3.14);
%c char 单个字符 printf("%c", 'A');
%s 字符串 printf("%s", "Hello");
%% 无 输出一个 % printf("100%%");

重点:printf 中 %f 既可以输出 float,也可以输出 double。需要保留几位小数就写 %.nf,如 %.2f 表示保留 2 位小数。

3. 保留小数输出

double ans = 3.14159;
printf("%.2f\n", ans);

输出:

3.14
double avg = 91.666666;
printf("%.2f\n", avg);

输出:

91.67

这是 GESP 一级很常见的格式化要求。

4. 输出多个变量

int a = 3, b = 5;
printf("%d + %d = %d\n", a, b, a + b);

输出:

3 + 5 = 8

5. 转义字符

printf 中常用的转义字符:

转义 含义
\n 换行
\t 制表符
\\ 反斜杠
\" 双引号
%% 百分号

示例:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    // \n 换行
    printf("第一行\n第二行\n");

    // \t 制表符(相当于按Tab,对齐文字)
    printf("姓名\t年龄\n小明\t12\n");

    // \\ 输出反斜杠 \
    printf("文件路径:C:\\code\\test.c\n");

    // \" 输出双引号 "
    printf("他说:\"你好!\"\n");

    // %% 输出百分号 %
    printf("及格率:95%%\n");

    return 0;
}

运行输出结果

第一行
第二行
姓名    年龄
小明    12
文件路径:C:\code\test.c
他说:"你好!"
及格率:95%

三、scanf 输入

1. 基本语法

scanf("格式字符串", &变量1, &变量2, ...);
  • 格式字符串用双引号,里面写格式控制符。
  • 变量前必须加 &(取地址符),这是 scanf 和 printf 最大的区别。
  • 变量个数和类型要和格式控制符一一对应。

示例:

int a;
scanf("%d", &a);

一级最高频易错点:scanf 中忘记写 &,程序无法正确读入数据,甚至可能崩溃。

2. 常用格式控制符

控制符 对应类型 说明
%d int 读入整数
%lld long long 读入长整数
%f float 读入单精度浮点数
%lf double 读入双精度浮点数
%c char 读入单个字符
%s 字符数组 读入字符串(字符串名前不加 &)

重点:scanf 中读取 double 必须用 %lf,不能用 %f。这一点和 printf 不同。

3. 连续输入多个变量

int a, b;
scanf("%d %d", &a, &b);

输入:

3 5

则 a = 3,b = 5。

也可以输入时用换行分隔:

3
5

scanf 会自动跳过空白字符。

4. 读入字符

char c;
scanf("%c", &c);

注意:scanf("%c", &c) 会读取下一个字符,包括空格和换行,不会自动跳过空白。如果要跳过空白再读字符,可以在 %c 前加一个空格:

scanf(" %c", &c);

5. 读入浮点数

double x;
scanf("%lf", &x);
float y;
scanf("%f", &y);

6. scanf 的返回值(了解)

scanf 返回成功读取的变量个数。例如:

int a, b;
int n = scanf("%d %d", &a, &b);

如果两个数都成功读入,n 为 2;如果只读入一个,n 为 1;如果读取失败,返回 EOF。一级了解即可,多用于循环读入。

四、scanf 与 printf 对照速查

数据类型 scanf 写法 printf 写法
int scanf("%d", &a); printf("%d", a);
long long scanf("%lld", &x); printf("%lld", x);
float scanf("%f", &x); printf("%f", x);
double scanf("%lf", &x); printf("%f", x); 或 printf("%.2f", x);
char scanf("%c", &c); printf("%c", c);
字符串 scanf("%s", s); printf("%s", s);

记忆口诀:

scanf 要加 &,printf 不用 &;
double 读用 %lf,double 写用 %f;
保留几位小数,写 %.n f。

五、scanf/printf 与 cin/cout 对比

项目 cin / cout scanf / printf
头文件 <iostream> <cstdio>
类型识别 自动识别 需要手动写格式符
取地址符 不需要 scanf 需要 &
格式化输出 需要 <iomanip> 直接写 %.2f 等
执行速度 较慢 较快
适用场景 普通输入输出 大数据、格式化输出

cin/cout 能自动识别变量类型,写起来简单;scanf/printf 需要指定类型,但格式化控制更强,大数据时效率更高。一级考试中两种方式都可能出现,建议都掌握。

六、常见错误

  1. scanf 忘记写 &

    scanf("%d", a);    // 错误
    scanf("%d", &a);   // 正确
    
  2. scanf 读 double 用了 %f

    double x;
    scanf("%f", &x);   // 错误
    scanf("%lf", &x);  // 正确
    
  3. printf 输出 double 用了 %lf(一级不推荐)

    printf("%lf", x);   // 虽然能运行,但一级建议用 %f
    printf("%f", x);    // 推荐
    
  4. 格式符和变量类型不匹配

    int a;
    scanf("%f", &a);   // 错误,类型不匹配
    
  5. 忘记 #include <cstdio>
    使用 scanf、printf 必须包含。

  6. printf 中忘记写格式符

    printf(a);          // 错误,不能直接输出变量
    printf("%d", a);    // 正确
    
  7. scanf 中变量前多写 & 或漏写 &

    int a;
    scanf("%d", &a);    // 正确
    

    字符串(字符数组)不需要 &:

    char s[20];
    scanf("%s", s);     // 正确,不需要 &
    
  8. 输出 % 忘记写 %%

    printf("100%");     // 错误
    printf("100%%");    // 正确
    

七、阅读程序写结果

题目 1

int a = 5, b = 3;
printf("%d + %d = %d\n", a, b, a + b);

输出:

5 + 3 = 8

题目 2

double x = 3.14159;
printf("%.2f\n", x);

输出:

3.14

题目 3

int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a * b);

输入:

4 6

输出:

24

题目 4

double x;
scanf("%lf", &x);
printf("%.3f\n", x);

输入:

2.5

输出:

2.500

题目 5

char c = 'A';
printf("%c %d\n", c, c);

输出:

A 65

题目 6

int sum = 275, n = 3;
double avg = 1.0 * sum / n;
printf("%.2f\n", avg);

输出:

91.67

八、总结

scanf 与 printf 是一级考试中输入输出的另一套重要工具。:

  1. scanf 读数据,变量前要加 &。
  2. printf 输出数据,不需要加 &。
  3. int 用 %d,long long 用 %lld。
  4. scanf 读 double 用 %lf,printf 输出 double 用 %f。
  5. 保留小数用 %.2f,数字几就保留几位。
  6. char 用 %c,字符串用 %s。
  7. 输出百分号用 %%。
  8. scanf/printf 和 cin/cout 都要掌握,考试中按题目要求选择。