scanf详解
大约 2 分钟输入输出
概念
scanf
是 语言中的标准输入函数,在 中同样可用,属于 <cstdio>
库。
在信息竞赛中,scanf
通常比 cin
更快,尤其是在处理大量输入数据时。
基本语法
scanf(const char* format, …);
format
是格式控制字符串
后续参数是用于存储读取值的变量地址
返回值是成功读入的数据项个数
常用格式说明符
整数类型
%d
: %ld
: %lld
: %u
:
浮点类型
%f
: %lf
: %Lf
:
字符和字符串
%c
: 单个字符%s
: 字符串
举几个栗子
读取基本数据类型
int a;
double b;
char c;
scanf("%d %lf %c", &a, &b, &c);
读取字符串
char ch[100];
scanf("%s", ch); // 注意:字符数组名不需要&
特点 :
- 读取到空白字符(空格、换行、制表符)为止
- 自动在末尾添加
\0
- 字符串数组名不需要 & 符号
读取二维字符数组
char ew[100][100];
for (int i = 0; i < n; i++) {
scanf("%s", ew[i]); // 每次读取一行
}
这种方法非常高效,特别适合读取网格地图。
指定宽度和精度
int a;
scanf("%5d", &a); // 最多读取5个字符作为整数
小技巧
读取不确定数量的输入
int a;
while (scanf("%d", &a) != EOF) {
// 处理数据
}
跳过特定字符
scanf("%d,%d", &a, &b); // 跳过逗号
scanf(" %s", str); // 跳过前导空白
读取行(包括空格)
char line[100];
scanf(" %[^\n]", line); // 读取一整行,包括空格
注意事项
内存安全 :确保为字符串分配足够的空间,避免缓冲区溢出
// 更安全的方式
char str[100];
scanf("%99s", str); // 指定最大读取长度
输入验证 :始终检查 scanf
的返回值以确保成功读取
格式匹配 :确保格式说明符与变量类型匹配
地址传递 :除字符数组外,所有变量都需要用 &
取地址