算法竞赛C/C++:输入与输出(上)
Chapter 7.C/C++输入输出(上)
一、getchar 和 putchar (快速读写)
getchar() 和 putchar()是属于C语言的库函数,在 C++中只要包含头文件
Part 1.getchar()函数
函数原型:int getchar(void)
基本用法:
(1).getchar()函数可以从用户的输入上获取一个字符,使用时不带有任何参数
(2).返回结果为所获取符号的ASCII码值,类型是 int (3).其原型定义在头文件
(4).等同于使用 cin和scanf() 方法读取一个字符 (5).getchar()通常与putchar()配合使用
#include
#include
using namespace std;
int main()
{
int ch = getchar(); //输入字符 a
cout << ch << endl; //输出a对应的 ASCII码值 97
cout << (char)ch << endl; //输出a
return 0;
}
getchar() 不会忽略起首的空白字符,总是返回当前读取的第一个字符,无论是否为空格
如果读取失败,返回常量 EOF,而 EOF通常为 -1
ps:如何让 getchar()读取失败返回-1?
答:在输入字符之前直接按 Ctrl + z
#include
#include
using namespace std;
int main()
{
int ch_1 = getchar(); //输入 a然后按ENTER,其实是输入了两个字符:a 和'
',在这里只有a被读取
cout << ch_1 << endl; //输出a的ASCII码值 97
int ch_2 = getchar(); //无需再次输入,它会自动读取上面未被读取的 '
'
cout << ch_2 << endl; //输出'
'的ASCII码值 10
return 0;
}
Part 2.putchar()函数
函数原型:int putchar( int character )
用法:
(1).向标准输出(通常是控制台屏幕)输出 单个字符
(2).可以输出普通字符、转义字符,或直接输出 ASCII 码值(函数会自动将其转换为对应字符)
#include
#include
using namespace std;
int main()
{
putchar(97); //97为 a的ASCII码值
putchar('
');
putchar('a');
return 0;
}
输出结果:
a
a
(3).putchar()不会在行尾自动进行换行
(4).putchar() 将它的参数字符输出到屏幕,其原型定义在头文件
(5).输出成功时,putchar()返回输出字符的ASCII码值
(6).输出失败时,putchar()会返回常量EOF
int ch = getchar(); //输入a
putchar(ch); //输出a
putchar('0');
putchar('a');
//输出:0a --> 注意没有进行换行
putchar('
'); //可以进行换行
二、printf 和 scanf
Part 1.printf()函数
(1).基本用法
函数原型:int printf( const char* format, ... )
作用:将参数文本输出到屏幕
其名字中的f 表示格式化,表示可以定制输出文本格式
注意事项:
使用时需包含头文件
printf()不会在行尾自动换行
(2).占位符
int num = 7;
printf("I have %d apples.
",num); // %d即为占位符
printf() 参数与占位符是一一对应关系,如果有 n 个占位符,printf() 的参数就应该有 n + 1 个
如果参数个数少于对应的占位符,printf() 可能会输出内存中的任意值。
printf()常用的占位符:
| 占位符 | 介绍 |
| %c | 字符 |
| %s | 字符串 |
| %d | 十进制整数 |
| %ld | 十进制 long 类型 |
| %lld | 十进制 long long 类型 |
| %u | unsigned int 类型 |
| %f | float 类型浮点数 和 double 类型浮点数(默认小数点后会打印6位小数 ) |
| %Lf | long double 类型浮点数 |
| %g | 6个有效数字的浮点数 |
| %p | 内存地址 |
(3).格式化输出
a.限定宽度
printf() 允许限定占位符的最小宽度
举例:%5d 表示这个占位符的宽度至少为 5 位。如果不满 5 位,对应的值的前面会添加空格
输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的 % 的后面插入一个 - 号
%12f 表示输出的浮点数最少要占据 12 位
如果这样打印123.45,由于小数的默认显示精度是小数点后 6 位,所以 123.45 输出结果的头部会添加 2 个空格
b.限定小数位数
举例:想要小数点后保留2位:%.2f
二者结合使用:%6.2f --> 表示输出字符串最小宽度为 6,小数点后保留 2位
c.用* 传参
最小宽度和小数位数这两个限定值,可以先用 * 代替,通过printf()的参数传入
printf("%*.*f
", 6, 2, 0.5);
printf("%6.2f
",0.5); -->这两种写法等价
Part 2.scanf()函数
函数原型:int scanf( const char* format(格式字符串), ... )
(1).基本用法
scanf()用于读取用户的键盘输入
使用时需包含头文件
scanf()的占位符后面一般不会加
scanf()中指定的格式和用户输入数据的格式要 严格匹配,否则可能会出错
int i = 0;
scanf("%d",&i); //&取地址操作符
Tip:
a. scanf()中存储数据的变量前面必须加上 & 运算符(指针变量除外),因为 scanf() 需要的是地址,必须将变量 i 的地址取出来传给 scanf 函数。
如果这里的变量 i 是数组,那就不用加 & 运算符
b. scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。
所以,用户输入的数据之间,有一个或多个空格不影响 scanf() 解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。
c. scanf() 处理用户输入的原理是:用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。
解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
(2).占位符
scanf() 使用的占位符与 printf()的基本一致
| 占位符 | 介绍 |
| %c | 字符 |
| %d | 整数 |
| %f | float 类型浮点数 |
| %lf | double 类型浮点数 |
| %Lf | long double 类型浮点数 |
| %s | 字符串 |
| %[ ] | 在方括号中指定一组匹配的字符(比如 %[0-9]),遇到不在集合之中的字符,匹配将会停止 |
上面所有占位符之中,除了 %c 以外,都会自动忽略起首的空白字符。
%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格
如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch),即 %c 前加上一个空格,表示跳过零个或多个空白字符
(3).scanf()的返回值
scanf()的返回值是一个整数,表示成功读取的变量的个数
如果没有读取任何项,或者匹配失败,则返回 0。
如果在成功读取任何数据之前,发生了 读取错误或者读取到文件结尾,则返回常量 EOF(-1) --> 一个数字都不输入,直接按 Ctrl + z
在竞赛中,我们一般会通过scanf()的返回值来处理多组数据输入的题目
while( scanf("%d %d",&a,&b) == 2)
{ ... }
//在这个程序中,当输入如 '#'时,程序就会停下来
三、cin 和 cout
Part 1.cin()函数
(1).基本用法
cin 是 C++ 中提供的标准输入流对象,使用 cin 来对键盘上输入的字符流进行数据的提取
cin 一般是和 >>(流提取运算符)配合使用的,功能与 scanf 类似
int num;
cin >> num;
(2).使用细节
a. cin 在读取的时候是根据用户的输入,从前往后,从上往下依次扫描
b. cin 在读取的过程中遇到空格,会自动跳过,所以不要担心在想要的字符前输入空白字符
当一行读取结束的时候,会自动换行,读取下一行的内容
c. cin 后面不可以跟换行 endl
(3).用途
当输入 数据量很少 的时候,我们就可以通过 >> 把所有的数据用一行代码完成接收,
而且无需关心数据的类型,和 scanf 函数比起来代码的书写非常简洁明了。
Part 2.cout()函数
(1).基本用法
cout 是 C++ 中提供的标准输出流对象,可以将数据以字符流的形式输出到控制台窗口上显示
cout 一般是和 <<(流插入运算符)配合使用,功能与 printf 类似
int num = 0;
cout << num << endl;
(2).cout() 的返回值
使用 cout 进行变量的输出,实质上是将变量插入到 cout 对象里,
并以 cout 对象作为返回值返回,因此我们还可以用 << 在后面连续输出多个内容,通过连续输入输出的方式对代码进行编写
(3).用途
cout 也可以用来连续输出多个数值,而且无需考虑数值的类型,因为它本身会做类型处理,和 printf 比起来比较方便。
(4).cin 和 cout 联合使用
cin 和 cout 的输入输出非常的方便,不需要手动控制格式,能够自动识别变量类型
当我们在键盘输入的数据不能被 cin解读为对应类型的数据时,读取就会失败

cin() 第二个需要读取的字符为 int类型,但是它却读取到了 char类型的字符 'a',因此从这里开始,后面 cin()都不能正确读取到相应的值
Part 3.原理拓展
不管什么类型的数据都是以字符流的形式输入和输出的
--> 类型 是编程语言层面的抽象概念,仅存在于程序的编译 / 运行阶段(内存处理环节),而输入输出的字符流本身是无类型的
四、六种输入输出函数对比
Part 1.输入函数对比
| 函数 | 语言 | 头文件(C++中) | 核心特点 |
| getchar() | C/C++ | 读取时不跳过空白字符,读取单个字符,包括空格、换行、制表符等空白字符,返回读取的 ASCII 码(失败时返回EOF) | |
| scanf() | C/C++ | 读取时自动跳过输入前的空格、换行、制表符等空白字符,返回成功读取的变量的个数(失败时返回EOF) | |
| cin() | C++ | 读取时自动跳过空格、换行、制表符等空白字符 |
Part 2.输出函数对比
| 函数 | 语言 | 头文件(C++中) | 核心特点 |
| putchar() | C/C++ | 输出单个字符,只能处理单个char类型数据,效率较高 | |
| printf() | C/C++ | 格式化输出,通过占位符(%d、%f等)控制输出格式,功能强大,适合复杂格式化场景 | |
| cout() | C++ | 流式输出,无需占位符,通过<<操作符直接输出,支持类型自动推导,代码简洁 |









