在 C++ 中,scanf 和 printf 是 C 语言标准输入输出库中的函数,用于格式化输入和输出。虽然在 C++ 中更常用 cin 和 cout,但这两个函数仍然广泛使用,尤其是需要高性能或格式化控制时。
1. printf – 格式化输出
用于将数据按指定格式输出到标准输出(通常是屏幕)。
常用格式说明符
%d:整数(十进制)%f:浮点数%c:字符%s:字符串%lf:双精度浮点数(C99/C++ 中%f也可用于double)%x:十六进制整数
示例
#include <iostream>
using namespace std;
int main() {
int a = 42;
double b = 3.14159;
char c = 'A';
const char* s = "Hello";
printf("整数:%d\n", a); // 整数:42
printf("浮点数:%.2f\n", b); // 浮点数:3.14 (保留两位小数)
printf("字符:%c\n", c); // 字符:A
printf("字符串:%s\n", s); // 字符串:Hello
printf("十六进制:%x\n", a); // 十六进制:2a
return 0;
}
2. scanf – 格式化输入
用于从标准输入(通常是键盘)读取数据并按照格式解析。
注意要点
- 传入的变量地址需要使用
&取地址符(字符串数组名本身是地址,不需要&) - 返回值是成功读取的项目数,可用于错误检查
示例
#include <iostream>
using namespace std;
int main() {
int age;
double salary;
char name[50];
printf("请输入姓名、年龄和工资(用空格分隔):");
// 注意:字符串数组 name 不需要 &
int result = scanf("%s %d %lf", name, &age, &salary);
if (result == 3) {
printf("姓名:%s\n年龄:%d\n工资:%.2f\n", name, age, salary);
} else {
printf("输入格式错误!\n");
}
return 0;
}
对比 C++ 的 cin/cout
| 特性 | scanf/printf | cin/cout |
|---|---|---|
| 类型安全 | 不安全(类型不匹配可能导致运行时错误) | 安全(类型在编译时检查) |
| 性能 | 通常更快(尤其大量数据时) | 较慢(默认与 C 流同步,可关闭) |
| 易用性 | 需要记忆格式符 | 更简单直观 |
| 扩展性 | 不支持自定义类型(除非用 C11 扩展) | 支持运算符重载 |
控制宽度对比
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=15,b=3355,c=9;
// 输出三个数字,用空格隔开,每个数字占8个宽度,最后换行
cout<<setw(8)<<a<<" "<<setw(8)<<b<<" "<<setw(8)<<c<<endl;
printf("%8d %8d %8d\n",a,b,c);
}
控制精度对比
#include <bits/stdc++.h>
using namespace std;
int main(){
double d=1.2345678;
// 保留四位小数输出
cout<<fixed<<setprecision(4)<<d;
printf("%.4lf",d);
}
自动填充对比
#include <bits/stdc++.h>
using namespace std;
int main(){
int e=45;
// 默认宽度5,不够填充0
cout<<setw(5)<<setfill('0')<<e; // 00045
printf("%05d",e); // 00045
}
输入控制巧妙结合题目
// 输入日期,格式:y-m-d
int y,m,d; // 年月日
scanf("%d-%d-%d",&y,&m,&d);
// 输入时间,格式:h:m:s
int h,m,s; // 时分秒
scanf("%d:%d:%d",&h,&m,&s);
格式说明符详解
格式:%[标记][长度][.精度]类型
- 标记:默认右对齐
-代表左对齐0代表空位补零
- 长度:代表数据至少占位的宽度
- 精度:代表保留小数位数,需要添加
.,且类型是浮点型 - 类型:
- int:d
- float:f
- double:lf
- char:c
- long long:lld
- 科学计数法:e
- 八进制:o
- 十六进制:x
转义符号对比
// 用cout输出带引号的单词"hello", \"代表要输出"而非字符串两端的标记
cout<<"\"hello\""; // "hello"
// 用cout输出\, \\ 代表要输出\
cout<<"\\"; // \
// 用printf输出5%,%%代表要输出%而非匹配某个数据
printf("%d%%",5); // 5%