本文讲解的是除了cin和cout外的其他输入输出
1.单字符输入输出:getchar与putchar
1.1getchar
getchar的作用是从标准输入流中获取一个字符(包括换行和空格等)
所处头文件:cstdio
使用格式:
int getchar();
返回值是整形(ascll码值),无需传参
举例1:读取字符a
我们在输入框中输入字符a,然后打印c值(a的ascll码值为97)的结果是97,然后强制类型转换为char之后输出就是a了
举例2:读取空格字符
我们输入了空格,然后输出空格的ascll码值32,最后又输出了一个空格,然后换行。这里我们用bbb来显示出我们输出的是空格
举例3:读取换行字符
输入换行字符也就是‘\n’,然后打印\n的ascll码值10,换行后输出\n。虽然这里我们在cahr()a之后没有加endl,却完成换行,这说明我们输出的就是换行符。
举例4:读取截止符
我们用Ctrl+z表示停止输入,而停止输入读取的ascll值是-1,所以a的值是-1.然后(char)的字符就是一个随机的字符
1.2putchar
既然getchar()是读取一个字符,那么为啥我们输出的时候还要强制类型转换那么复杂?
其实之所以不能直接输出字符是因为和getchar组合使用的是putchar()。
putchar的作用是将参数字符输出到控制台
所处头文件:cstdio
使用格式:
putchar(c);
输出成功:
putchar会打印对应ascll码值的字符,打印成功就返回该字符的ascll码值
输出失败:
若打印失败就返回EOF常量
2.格式化输入输出:printf与scanf
2.1printf
五个常用占位符:
1.%d:整型
2.%s:字符串
3.%f:浮点型
4.%c:单字符
5.%n:无符号整型
(1)限定宽度:
printf可以通过在占位符的字母前加数字来控制输出的宽度
这里我们就控制了输出字符数至少为5,如果超过5就正常输出,不用在数字前面补0
而我们默认情况下是对输出数据进行右对齐,也就是在数据前面补0.若我们在占位符%后面加上一个’-’就可以将对齐转换为左对齐。
(2)限定小数位数
小数的默认位数是保留小数点的后六位,如果我们希望只保留小数点后两位,那么我们可以在占位符的字母前面加一个'.',然后在'.'的后面写上需要保留的小数点位数,就可以保留指定位数的小数
我们先看默认情况:
默认情况下保留了六位小数
然后我们看一下控制了保留两位小数的情况:
这里%.2f就是保留两位小数的浮点数的格式输出
我们也可以同时控制小数位数和输出宽度:
这里%6.2f表示右对齐输出大于等于6个字符,并保留小数点后两位。
注意:小数点也是一个字符
思考:我们是否可以不具体在“ ”中指定占位符的宽度和小数点设置?
可以,我们可以用'*'来占位,然后在后面传参控制。
不过需要把宽度限制和小数点限制放在前面两个参数位置
2.2scanf
(1)scanf中指定的输入格式和程序输入的数据格式必须完全一致,否则不会按照预期进行数据获取
下面我们以输入多个数据的情况为例讲解:
在scanf中我们加上了逗号间隔,所以这里我们用空格为间隔输入的时候会出现读取失败的问题
正确的输入:
我们在输入的数据时候用逗号间隔开,完全符合了输入的格式,从而可以正确的从输入流中读取数据
(2)scanf处理字符时会自动忽略空白字符,如空格,换行符,制表符也就是说我们可以在两个数据输入之间添加任意空格,换行符等空白字符
这里我们在四个数据的输入之间添加了任意空白字符,但是仍然不影响数据的读取。
接下来我们将会讲解scanf处理用户输入的原理
(3)scanf处理用户输入的原理:
用户输入的数据会先存到缓存中,当按下回车键的时候再按照占位符的类型对缓存进行解读。每次解读都是从上一次完遗留的下一个字符开始,直到读完缓存/读到第一个不满足条件的字符为止。
这里的读取过程如下:
首先对%d进行解读,读取-12之后遇到.,而.不是属于整形的符号,所以停止读取。然后从.开始对%f进行解读,读取.47之后遇到#,而#不属于小数符号,所以停止读取。
综上,读取到的就是-12和0.47
(4)%c占位符
%c占位符会读取第一个字符,无论他是否是空白字符。
这里我们输入了空格,然后%c读取到的就是空格,所以在printf输出的时候---与---之间有一个空格
如果我们需要忽略前导空白字符,可以在%c前面加一个空格:
这里我们前面输入了多个空格和换行,但是直到输入j之前,printf都没有执行,说明及时%c忽略了前导空白字符
(5)scanf的返回值:一个整数,表示录入成功的变量个数
没有读取到字符,或者匹配失败就返回0
这里的格式化字符串都是%d,而我们输入的数据都是字符类型的,所以都匹配失败了,scanf返回值为0
若遇到读取错误或者读取到文件末尾就返回-1
这里我们演示ctrl+z的结束输入功能,输入完1之后,我们直接输入ctrl+z让输入结束,所以最后只有一个数据录入成功了。