第二章:C/C++输入输出(上)
1.getchar和putchar
getchar() 和 putchar() 是属于C语⾔的库函数,C++是兼容C语⾔的,所以C++中只要正确包 含头⽂件也可以正常使⽤这两个函数。
1.1getchar
函数原型:
int getchar(void);
getchar()函数返回用户从键盘输入的一个字符(本质是返回他的asc码值),使用时不带有任何参数
运行到这个命令就会暂停,等待用户键盘输入,等同于使用cin或scanf读取一个字符
它的原型定义在头文件<cstdio>,使用时必须包含这个头文件!
注意:
getchar不会忽略起首的空白字符,总是返回当前读取的第一个字符,无论是否是空格;如果你用了多个getchar,他连最后的换行符都不会放过,也会被读取
如果读取失败,返回常量EOF(通常是-1)所以返回值必须是int而不是char(具体原因见文件相关函数的那篇博客)
如何让他读取失败?按下Ctrl+z即可
在使用时我们发现,因为返回值是int类型,如果想用cout来打印的话,必须强制类型转换。感觉很麻烦,有什么好办法呢?
我们通常把getchar和putchar一起使用,这俩才是原配~
1.2putchar()
函数原型:
int putchar(int character);
putchar()函数将他的参数字符输出到屏幕,它的原型也在<cstdio>中
#include<cstdio>
int main()
{
int ch=0;
ch=getchar();
putchar(ch);
return 0;
}
这样就不存在转换类型的问题了~
操作成功时,putchar返回输出的字符(本质还是返回他的asc码值),否则返回常量EOF
小提示:这⾥⼤家先学会这两个函数的使⽤,在后期算法模块,会学到快速读写,到时候就会⽤ 到这两个函数。
2.scanf和printf
scanf和printf是属于C语⾔的库函数,C++是兼容C语⾔的,所以C++中只要正确包含头 ⽂件也可以正常使⽤这两个函数。⽽且这两个函数在算法竞赛题⽬中使⽤的⾮常频繁,尤其是在输出格式控制中,所以接下来我们这⾥认真学习⼀下。
2.1printf
函数原型如下
int printf ( const char * format, ... );
...是可变参数列表,具体见文件操作相关函数那篇博客
2.1.1基本用法
printf中的f代表格式化,可以指定输出文本的格式
printf不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换 ⾏。
如果⽂本内部有换⾏,也是通过插⼊换⾏符来实现,
2.1.2占位符
所谓“占位符”,就是这个位置可以⽤其他值代⼊(就像你用数学书给朋友占座一样,最后数学书的位置被你朋友替换了)
参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf()可能会输出内存中的任意值。
以下是两个占位符三个参数的例子:
%lld:十进制longlong类型
%f:double float类型
%Lf:long double类型浮点数
%u:无符号整数(unsigned int)
%zd:size_t类型
%%:输出一个百分号
2.1.3格式化输出
上面实例中,%5d表示这个占位符的宽度至少为5位,如果不满五位,酒会在对应的值前面加空格。输出的值默认右对齐,即内容前面有空格;如果希望左对齐,即输出内容后面加空格,就可以在占位符%后面加一个-号
由于⼩数的默认显⽰精度是⼩数点后6位输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写 成 %.2f 。
最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。
#include <cstdio>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
// 等同于printf("%6.2f\n", 0.5);
2.2scanf
int scanf ( const char * format, ... );
2.2.1基本用法
特别注意,scanf函数的占位符后⾯⼀般不会加 \n , \n 是换行,⼀般在输出的时候才使用
它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编 译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。这是因为C语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数据。
小提示:
scanf函数中存储数据的变量前面必须加上&运算符(指针变量除外),因为scanf()需要的是地址,必须要将i的地址取出来
如果这里的i变量是数组,就不用加&运算符(数组名就是首元素的地址,后期介绍)
scanf("%d%d%d%d", &a, &b, &c, &d);
scanf("%d %d %d %d", &a, &b, &c, &d);
scanf("%d,%d,%d,%d", &a, &b, &c, &d);//这种如果你不写,就打印不出来想要的效果
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。(对比getchar)所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影想scanf解读数据,将输⼊分成⼏⾏,也不影响解读。
scanf处理输入的原理是:
用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读,解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止
#include <cstdio>
int main()
{
int x = 0;
float y = 0;
// ⽤⼾输⼊" -13.45e12# 0"
scanf("%d", &x);
printf("%d\n", x);
scanf("%f", &y);
printf("%f\n", y);
return 0;
}
读取过程详解:
读取到-13,scanf都认为这是可以出现在整型里面的,接下来读到小数点了,这不能出现在整形里面,停止读取;在接下来读取.45e12,这是可以出现在浮点数里面的,而再接下来,出现了#,不能出现在%f里面,读取停止
2.2.2占位符
%f:float类型
%lf:double类型
%Lf:long double类型
%[]:在⽅括号中指定⼀组匹配的字符(⽐如%[0-9]),遇到不在集合之 中的字符,匹配将会停⽌。
在上面所有占位符中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总返回当前第一个字符,无论是不是空格
如果想抢纸条过字符前面的空白字符,可以写成以下形式:即%c前面加上一个空格,表示跳过0个或多个空白字符
scanf(" %c",&ch);
了解这一点后,当%c,%d等占位符连续使用的时候,也要注意,%c默认不会跳过空白字符,所以输入的时候,要非常小心!
#include <cstdio>
int main()
{
int a;
char ch;
scanf("%d%c", &a, &ch);
printf("%d %c\n", a, ch);
return 0;
}
如果在输⼊的时候,就是想在整数和字符之间加上空格,那么scanf中的格式串中%c的前⾯就要加上 空格。
#include <cstdio>
int main()
{
int a;
char ch;
scanf("%d %c", &a, &ch);//%c的前⾯加上空格,是强制跳过数据输⼊中的空⽩字符
printf("%d %c\n", a, ch);
return 0;
}
2.2.3scanf的返回值
返回值表示成功读取的变量个数
没读取任何项/匹配失败:返回0;
适用情况:进入输入环节什么多不做,等待程序自己结束;第一个数据就匹配失败,具体情况见scanf读取原理,比如:第一个类型是int,你却输入一个#,直接就匹配失败
在读取任何数据之前,读取错误或遇到文件末尾,返回常量EOF(-1)
适用情况:读取错误或输入Ctrl+z
我们⼀般会通过scanf的返回值来处理多组数据输⼊的竞赛题⽬,在后期的博客中⼤家都会一一见到的
标签:字符,读取,int,day4,备赛,占位,蓝桥,printf,scanf From: https://blog.csdn.net/sally20060710/article/details/145229436