欢迎光临
我们一直在努力

算法竞赛C/C++:输入与输出(上)

Chapter 7.C/C++输入输出(上)

一、getchar 和 putchar (快速读写)

 
getchar() 和 putchar()是属于C语言的库函数,在 C++中只要包含头文件 <cstdio> 便可使用 

Part 1.getchar()函数

函数原型:int getchar(void) 

基本用法:

(1).getchar()函数可以从用户的输入上获取一个字符,使用时不带有任何参数
(2).返回结果为所获取符号的ASCII码值,类型是 int                                                                     (3).其原型定义在头文件 <cstdio>中
(4).等同于使用 cin和scanf() 方法读取一个字符                                                                             (5).getchar()通常与putchar()配合使用

#include <iostream>
#include <cstdio>
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 <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int ch_1 = getchar(); //输入 a然后按ENTER,其实是输入了两个字符:a 和'\\n',在这里只有a被读取 
    cout << ch_1 << endl; //输出a的ASCII码值 97 
    int ch_2 = getchar(); //无需再次输入,它会自动读取上面未被读取的 '\\n' 
    cout << ch_2 << endl; //输出'\\n'的ASCII码值 10 
    return 0;

Part 2.putchar()函数

函数原型:int putchar( int character )

用法:

(1).向标准输出(通常是控制台屏幕)输出 单个字符
(2).可以输出普通字符、转义字符,或直接输出 ASCII 码值(函数会自动将其转换为对应字符)

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
putchar(97); //97为 a的ASCII码值
putchar('\\n');
putchar('a');
return 0;
}

输出结果:
a
a

(3).putchar()不会在行尾自动进行换行
(4).putchar() 将它的参数字符输出到屏幕,其原型定义在头文件 <cstdio>
(5).输出成功时,putchar()返回输出字符的ASCII码值
(6).输出失败时,putchar()会返回常量EOF

int ch = getchar(); //输入a
putchar(ch);        //输出a

putchar('0');
putchar('a');
//输出:0a –> 注意没有进行换行 
putchar('\\n'); //可以进行换行 

二、printf 和 scanf 

Part 1.printf()函数

(1).基本用法 

函数原型:int printf( const char* format, … )

作用:将参数文本输出到屏幕
其名字中的f 表示格式化,表示可以定制输出文本格式
注意事项: 
使用时需包含头文件<cstdio> 
printf()不会在行尾自动换行 

(2).占位符 

int num = 7;
printf("I have %d apples.\\n",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\\n", 6, 2, 0.5); 
printf("%6.2f\\n",0.5);        –>这两种写法等价 

Part 2.scanf()函数

函数原型:int scanf( const char* format(格式字符串), … )

(1).基本用法
scanf()用于读取用户的键盘输入 
使用时需包含头文件<cstdio> 
scanf()的占位符后面一般不会加 \\n 
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++ <cstdio> 读取时不跳过空白字符,读取单个字符,包括空格、换行、制表符等空白字符,返回读取的 ASCII 码(失败时返回EOF)
scanf() C/C++ <cstdio> 读取时自动跳过输入前的空格、换行、制表符等空白字符,返回成功读取的变量的个数(失败时返回EOF)
cin() C++ <iostream> 读取时自动跳过空格、换行、制表符等空白字符

Part 2.输出函数对比

函数 语言 头文件(C++中) 核心特点
putchar() C/C++ <cstdio> 输出单个字符,只能处理单个char类型数据,效率较高
printf() C/C++ <cstdio> 格式化输出,通过占位符(%d、%f等)控制输出格式,功能强大,适合复杂格式化场景
cout() C++ <iostream> 流式输出,无需占位符,通过<<操作符直接输出,支持类型自动推导,代码简洁
赞(0)
未经允许不得转载:171主机测评 » 算法竞赛C/C++:输入与输出(上)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址