• C++
  • C++ scanf / printf 零基础完整教程

  • @ 2026-9-6 10:19:37

C++ scanf / printf 零基础完整教程(GESP必考)

scanf输入、printf输出,来自C语言,C++完全兼容。 头文件必须写:#include <cstdio> 对比 cin / cout:scanf/printf 速度更快,处理大数据输入不容易超时,GESP考试经常使用。

基础语法

printf 输出

printf("格式字符串", 参数列表);

格式占位符:用来“挖空”,后面变量填到空位。

占位符 作用 示例
%d int 整数(十进制) printf("%d", a);
%f double 浮点数 printf("%f", x);
%c 单个字符 printf("%c", ch);
%s 字符串char[] printf("%s", str);
%% 打印一个百分号 printf("%%");输出%

scanf 输入

scanf("格式字符串", &变量名);

⚠️非常重要:普通变量前面要加取地址符号 &!

& 获取变量内存地址,scanf要把读到的数据放进这个地址。 ❌错误:scanf("%d",a); ✅正确:scanf("%d",&a);

只有数组/字符串char数组不用写&,数组名字本身就是地址。


完整示例1:整数输入输出

#include <cstdio>   // scanf、printf必须头文件
int main()
{
    int a;
    // 读取一个整数,存入a,一定要写 &a
    scanf("%d", &a);

    // 输出a
    printf("你输入的数字是:%d\n", a);
    // \n 代表换行,等价cout << endl;
    return 0;
}

输入:100 输出:你输入的数字是:100

示例2:多个数据读写

#include <cstdio>
int main()
{
    int a,b;
    // 读两个整数,空格、回车分隔都可以
    scanf("%d%d", &a, &b);

    printf("a=%d , b=%d , a+b=%d\n", a, b, a+b);
    return 0;
}

输入:3 5 输出:a=3 , b=5 , a+b=8

示例3:浮点数 double

#include <cstdio>
int main()
{
    double x;
    scanf("%lf", &x);   // ✨注意:scanf读double用 %lf
    printf("x = %f\n", x); // printf输出double用 %f
    return 0;
}

⚠️高频坑!

  • scanf读取double:%lf
  • printf打印double:%f

设置保留小数位数(考试超级常用)

%m.nf:m总宽度,n保留小数位数

double pi = 3.14159;
printf("保留2位小数:%.2f\n", pi);   //输出3.14
printf("保留4位小数:%.4f\n", pi);   //输出3.1416
  • %.2f:只指定小数2位,总宽度自动,日常写这个最多。

示例4:单个字符 char

#include <cstdio>
int main()
{
    char ch;
    scanf("%c", &ch);
    printf("字符为:%c\n", ch);
    return 0;
}

⚠️坑:%c会读取空格、回车!换行符也会被当成字符读进去。

示例5:C风格字符串 char数组

#include <cstdio>
int main()
{
    char s[100]; // 字符数组,最多存99个字符
    scanf("%s", s); // ✔数组名s本身就是地址,不要加 &
    printf("%s\n", s);
    return 0;
}

输入:Hello 输出:Hello

%s读到空格就停止,不能读取带空格的句子。


📌格式输出进阶(GESP选择题考点)

语法:%[宽度][.精度]类型

写法 说明 例子值 输出结果
%5d 占5字符宽度,右对齐,左边补空格 12 12
%-5d 负号:左对齐,右边补空格 12
%05d 宽度5,前面补0 00012
%.3f 保留小数点后3位 3.14 3.140

示例代码

#include <cstdio>
int main()
{
    int num =12;
    printf("|%5d|\n",num);   // |   12|
    printf("|%-5d|\n",num);  // |12   |
    printf("|%05d|\n",num);  // |00012|
    return 0;
}

🔥高频易错坑(考试必错点汇总)

  1. scanf普通变量忘记写 &
int a;
scanf("%d",a);   // ❌错误!
scanf("%d",&a);  // ✔正确
  1. double输入输出占位符混淆
double x;
scanf("%f",&x);  // ❌错误!scanf读double必须%lf
scanf("%lf",&x); // ✔
printf("%lf",x); // 可以运行,但习惯写%f ✔
  1. char数组字符串多加&
char str[100];
scanf("%s",&str); // ❌多余&
scanf("%s",str);  // ✔数组名本身是地址
  1. %c读取回车换行 scanf("%c")会把回车当成字符读入。前面如果读过数字,缓冲区残留换行,会直接被%c捕获。 解决办法:scanf(" %c", &ch); 百分号前面加空格,可以吃掉换行、空格。
int a;
char c;
scanf("%d", &a);
scanf(" %c", &c); // 空格!过滤掉回车
  1. printf不要写&!printf只需要变量值,不需要地址。

cin/cout vs scanf/printf对比表

项目 scanf / printf cin / cout
头文件 #include <cstdio> #include <iostream>
整数 %d 直接写变量
double输入 %lf
double输出 %f
小数控制 %.2f fixed << setprecision(2),需要<iomanip>
速度 快,大数据不会超时 慢,大量数据建议关闭同步
取地址 scanf需要& 不需要

如果想让cin/cout速度接近scanf,加两行:

ios::sync_with_stdio(false);
cin.tie(nullptr);

📝综合练习题代码

题目:输入圆半径r,输出直径、周长、面积,保留4位小数

#include <cstdio>
const double pi = 3.14159;
int main()
{
    double r;
    scanf("%lf", &r);
    double d = 2*r;
    double c = 2*pi*r;
    double s = pi*r*r;
    printf("%.4f %.4f %.4f\n", d, c, s);
    return 0;
}

输入:3 输出:6.0000 18.8495 28.2743


小作业(你可以自己写)

  1. 输入两个整数x,y,使用scanf读取,printf输出它们的和、差、积。

2 条评论

  • @ 2026-9-6 10:39:29
    // 引入标准输入输出流头文件,用于cin、cout
    #include<iostream>
    // 引入C语言标准输入输出头文件,备用scanf/printf
    #include<cstdio>
    // 使用标准命名空间,省去std::前缀
    using namespace std;
    
    int main() {
    	int a = 100,b=200;
    	printf("这个数是:%d\n",a);
    	printf("这个数是:%d+%d\n",a,a);
    	printf("这个数是:%d+%d=%d\n",a,b,300);
    	double f1=3.1415926;
    	printf("这个数是:%f\n",f1);//%f是float占位符
    	printf("这个数是:%lf\n",f1);//l字母L %lf double
    	printf("这个数是:%.2lf\n",f1);//保留2位小数
    	printf("这个数是:%.3lf\n",f1);
    	// 程序正常结束,返回0
    	return 0;
    }
    
    • @ 2026-9-6 10:20:41

      C++ 相邻字符串自动拼接 + """hello"""陷阱完整教程(适配GESP教学)

      ✅知识点前置

      C++规则:两个紧紧挨在一起的字符串字面量,编译器会自动合并成1个字符串

      注意:只能是双引号包裹的常量字符串,变量不能拼接!

      // 编译器自动合并,两行代码效果完全一样
      cout << "ab""cd";
      cout << "abcd";
      

      原理:"ab""cd" →编译器拼接 →"abcd" 多个连续相邻字符串也能合并:"" "hello" "" →"hello"

      Python有"""多行字符串""";C++语言标准没有三引号字符串语法!

      一、"""hello"""拆解原理(重点)

      代码:

      cout << """hello""" << endl;
      

      编译器从左到右扫描引号:

      1. "开始,第2个"结束 → ""(空字符串)
      2. 紧接着 "hello" →正常字符串
      3. 紧接着 "" →空字符串 最终等价代码:
      cout << "" "hello" "" << endl;
      

      3段相邻字符串自动拼接,空字符串不增加内容,结果="hello" ✅单行代码碰巧运行成功!

      并不是C++认识""",只是引号被拆开了!

      画图拆解

      """hello"""
      拆分: ""   "hello"   ""
      拼接: "" + "hello" + "" = "hello"
      

      二、验证实验代码(可直接复制运行,带注释)

      #include <iostream>
      using namespace std;
      int main()
      {
          //写法1:三引号写法(巧合生效)
          cout << """hello""" << endl;
      
          //写法2:编译器真实等价形式
          cout << "" "hello" "" << endl;
      
          //写法3:标准正常写法(考试推荐)
          cout << "hello" << endl;
          return 0;
      }
      

      三段代码输出完全相同:

      hello
      hello
      hello
      

      三、致命大坑1:不能换行!(高频考题)

      // ❌错误!编译直接报错!
      cout << """
      第一行
      第二行
      """ << endl;
      

      原因:普通字符串字面量不能直接换行。 Python三引号可以换行,C++这个巧合写法做不到多行文本。

      如果想要多行字符串,C++标准方案二选一: 方案1(GESP推荐,传统写法)

      cout << "第一行\n"
              "第二行\n";
      

      方案2(C++11原始字符串R"( )",真正多行)

      cout << R"(第一行
      第二行)";
      

      四、致命大坑2:引号数量变化,结果出乎意料(选择题考点)

      测试1:cout << """A""B""" << endl; 拆分:"" "A" "" "B" "" 拼接结果:"AB",输出AB

      测试2:cout << """""" << endl; 拆分:"" "" "",全部是空字符串,输出空白。

      这种写法可读性极差!GESP正式考试禁止使用""",判题系统可能报错扣分!

      五、配套练习题(4道单选,可放进试卷)

      第1题

      程序cout << """GESP""" << endl;输出结果是() A. """GESP""" B. GESP C. ""GESP"" D.编译报错 ✅答案:B 解析:拆分为"" "GESP" "",拼接得到"GESP"

      第2题

      关于C++中"""test"""写法,正确的是() A.属于C++原生三引号语法,可以书写多行字符串 B.等价Python的三引号字符串,支持直接换行 C.单行能够运行,依靠相邻字符串自动拼接,不能换行 D.GESP考试推荐使用该写法 ✅答案:C

      第3题

      代码cout << "" "Hi" "" "!" "" << endl;输出() A. Hi! B. ""Hi""! C. "" "Hi" "" "!" "" D.编译报错 ✅答案:A 解析:多个相邻字符串合并为"Hi!"

      第4题

      下面代码编译失败的是() A. cout << """ok""" B. cout << "" "ok" "" C.

      cout << "第一行\n"
              "第二行";
      

      D.

      cout << """
      abc
      """;
      

      ✅答案:D 解析:D选项字符串中间换行,编译报错。

      📖一句话总结背诵(给学生)

      1. """hello"""不是C++自带语法,只是引号被拆成几段;
      2. 原理:相邻常量字符串自动拼接;
      3. 单行侥幸运行,不能换行;
      4. 写程序不要模仿,考试使用标准双引号。
      • 1