- 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:%lfprintf打印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;
}
🔥高频易错坑(考试必错点汇总)
- scanf普通变量忘记写 &
int a;
scanf("%d",a); // ❌错误!
scanf("%d",&a); // ✔正确
- double输入输出占位符混淆
double x;
scanf("%f",&x); // ❌错误!scanf读double必须%lf
scanf("%lf",&x); // ✔
printf("%lf",x); // 可以运行,但习惯写%f ✔
- char数组字符串多加
&
char str[100];
scanf("%s",&str); // ❌多余&
scanf("%s",str); // ✔数组名本身是地址
%c读取回车换行scanf("%c")会把回车当成字符读入。前面如果读过数字,缓冲区残留换行,会直接被%c捕获。 解决办法:scanf(" %c", &ch);百分号前面加空格,可以吃掉换行、空格。
int a;
char c;
scanf("%d", &a);
scanf(" %c", &c); // 空格!过滤掉回车
- 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
小作业(你可以自己写)
- 输入两个整数x,y,使用
scanf读取,printf输出它们的和、差、积。
2 条评论
-
admin SU @ 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;编译器从左到右扫描引号:
"开始,第2个"结束 →""(空字符串)- 紧接着
"hello"→正常字符串 - 紧接着
""→空字符串 最终等价代码:
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选项字符串中间换行,编译报错。
📖一句话总结背诵(给学生)
"""hello"""不是C++自带语法,只是引号被拆成几段;- 原理:相邻常量字符串自动拼接;
- 单行侥幸运行,不能换行;
- 写程序不要模仿,考试使用标准双引号。
- 1