一、前言:C++ 输入输出的 困惑
刚入门 C++ 的小伙伴,是不是对输入输出有点懵?都有 cin 、 cout 了,咋又冒出 scanf 和 printf 这俩?有啥用?别慌,今天咱们就讲讲它们在 C++ 里的用法,带大家玩转输入输出!
二、 printf 和 scanf 基本用法
在 C++ 里用这俩,得先导入头文件→→
#include <cstdio>
(一) printf :格式化输出
printf 负责把数据 “打扮” 好看了,输出到终端。语法长这样:
int printf(const char* format, ...);
format 是个 “模板”,里面有普通文字和 % 开头的占位符,用来指定输出变量的类型和格式 。
常用占位符看这里:
占位符 | 功能说明 | 示例 |
%d %i | 输出整数(int 类型) | printf("整数:%d", 42);` → 输出 `整数:42 |
%f | 输出浮点数(float/double) | 想保留两位小数?printf("浮点数:%.2f\n", 3.14159); → 输出 浮点数:3.14 |
%c | 输出单个字符(char类型) | printf("字符:%c\n", 'A');→ 输出 字符:A |
%s | 输出字符串 | printf("字符串:%s\n", "Hello, World!"); → 输出 字符串:Hello, World! |
%X %x | 十六进制输出整数 | printf("十六进制:%X\n", 42);`→ 输出 十六进制:2A |
%o | 八进制输出整数 | printf("八进制:%o\n", 10); → 输出 八进制:12(10 的八进制是 12 哟) |
%% | 输出百分号 % | printf("占比:%%\n");` → 输出 占比:% |
要问 \n是啥?换行!endl只在 instream中!
参考代码 & 运行效果:
#include <cstdio>
int main() {
int a = 42;
double b = 3.14159;
char c = 'A';
const char* str = "Hello, World!";
printf("Integer: %d\n", a); // 输出整数
printf("Float: %.2f\n", b); // 输出浮点数,保留两位小数
printf("Character: %c\n", c); // 输出字符
printf("String: %s\n", str); // 输出字符串
printf("Hexadecimal: %X\n", a); // 输出十六进制
return 0;
}
运行后终端会打印:
Integer: 42
Float: 3.14
Character: A
String: Hello, World!
Hexadecimal: 2A
(二) scanf :格式化输入
scanf 从键盘(标准输入)读数据,语法是:
int scanf(const char* format, ...);
和 printf 类似,但要传变量的地址(用 & 符号取地址) 。常用占位符也安排上:
占位符 | 功能说明 | 示例 |
%d / %i | 读取整数 | scanf("%d", &a); (把输入的整数存到 a 里) |
%f | 读取浮点数 | scanf("%f", &b); ( b 是 float 类型时用) |
%lf | 读取双精度浮点数( double ) | scanf("%lf", &b); ( b 是 double 类型时用,记得和 printf 的 %f 区分开) |
%c | 读取单个字符 | scanf(" %c", &c); (前面加空格,跳过输入前的空白字符,精准读字符!) |
%s | 读取字符串(遇到空白停止) | scanf("%s", str); ( str 是字符数组,存输入的字符串,不用加 & 哦,因为数组名本身就是地址~) |
%X / %x | 读取十六进制整数 | scanf("%X", &a); (输入 2A , a 会得到 42 哟) |
%o | 读取八进制整数 | scanf("%o", &a); (输入 12 , a 会得到 10 哟) |
参考代码 & 运行逻辑:
#include <cstdio>
int main() {
int a;
double b;
char c;
char str[100];
printf("Enter an integer: ");
scanf("%d", &a); // 输入整数,存到 a
printf("Enter a float: ");
scanf("%lf", &b); // 输入双精度浮点数,存到 b
printf("Enter a character: ");
scanf(" %c", &c); // 加空格,跳过前面的回车、空格,读字符存到 c
printf("Enter a string: ");
scanf("%s", str); // 输入字符串,存到 str(遇到空格/回车就停)
// 输出你输入的内容,看看对不对~
printf("You entered:\n");
printf("Integer: %d\n", a);
printf("Float: %.2f\n", b);
printf("Character: %c\n", c);
printf("String: %s\n", str);
return 0;
}
运行时,按照提示输入,比如输入:
42
3.14
A
Hello
终端就会输出:
You entered:
Integer: 42
Float: 3.14
Character: A
String: Hello
三、 printf / scanf vs cin / cout ( 大 PK)
对比项 printf / scanf (C 来的老江湖) cin / cout (C++ 新贵)
来源 C 语言继承 C++ 标准库的流式输入输出
类型安全性 得手动写对占位符,写错容易出 bug 自动匹配类型,更安全
速度 直接操作底层,速度快一丢丢 有抽象层,稍慢(一般场景感知不到)
易用性 得记占位符,对新手不太友好 直接 >> / << ,简单直观
格式化 支持复杂格式化 想复杂格式化,得额外用 setprecision 这些工具
错误处理 处理麻烦,得自己盯着 自带异常处理机制,更省心
四、GESP 等级考里的常见用法(“实战场景”)
(一)输出格式控制
考试常让按特定格式输出,比如:
- 浮点数保留两位小数
- 整数转十六进制/八进制
对比 cout 的写法, printf 有时候更简洁:
// printf 写法
printf("%.2f\n", 3.14159); // 直接输出 3.14
printf("%X\n", 42); // 直接输出 2A
// cout 写法(得加头文件 <iomanip> 用 setprecision)
#include <iostream>
#include <iomanip>
using namespace std;
cout << fixed << setprecision(2) << 3.14159 << endl; // 输出 3.14
cout << hex << 42 << endl; // 输出 2a
(二)输入格式控制
考试会要求读特定格式输入,比如:
- 读一个整数和一个浮点数 → scanf("%d %lf", &a, &b); 或者 cin >> a >> b;
- 读字符串还得忽略前面的空格 → scanf(" %s", str); (加空格跳过空白)
这俩效果差不多,但 scanf 更贴近底层操作,有时候处理简单需求更直接~
五、总结:选对工具,事半功倍
- 想写简单代码、追求直观 → 用 cin / cout 就行,新手友好!
- 处理复杂格式化(比如考试里的输出要求)、追求效率 → printf / scanf 更靠谱!
现在, printf 和 scanf 这俩你应该熟了吧?快去代码里试试~~
//文章有点长,感谢看完!制作不易,点个赞吧!