输入输出专题

一、字符输出函数和格式输出函数

C语言无I/O语句,I/O操作由函数实现

#include <stdio.h>

字符输入函数:getchar(); ctry d 结束输入,返回-1

字符输出函数:putchar(c),c为字符常量、变量或表达式

字符串输入函数:gets();

字符串输入函数:puts(); s输出完自动换行

格式输入函数:printf("格式控制串",地址表)

格式输出函数:printf("格式控制串",输出表)

格式符

作用

i/d

十进制整数

x/X

十六进制无符号整数

o

八进制无符号整数

u

无符号十进制整数

c

单一字符

s

字符串

e,E

指数形式浮点小数

f

小数形式浮点小数

g

e和f中较短一种

%%

百分号本身

用“%c”格式符时,空格和·转义字符作为有效字符输入

整型数据遇到空格、TAB、或回车、非法输入、遇宽度结束。

二、输入函数的垃圾处理:

方法一:用getchar()清除

方法二:用格式串中空格或"%*c"来吃掉

三、getchar接收字符串

实际上getchar函数是从缓冲区读取数据的,而不是从你的屏幕上读取数据.

  1. 键盘负责往缓冲区写入数据,而getchar函数负责读取数据.

  1. getchar函数不会关心你实际输入的是什么,它只负责从缓冲区读取数据,而且每次读取一个字符.

  1. 你点击键盘的时候,实际上是往缓冲区输入:

  • 你按下a,则缓冲区中保存了一个字符a

  • 你按下b,则缓冲区中又保存了一个字符b

  • 你按下c,则缓冲区中又保存了一个字符c

  • 你按下1,则缓冲区中又保存了一个字符1

  • 你按下backspace删除键,则缓冲区中删除了一个字符(最后保存的那个1)

  • 除非你按下Enter,不然你其实就是在往缓冲区中塞数据.

  • 关键点来了:当你按下Enter的时候,发生了两个动作.首先是往缓冲区保存了一个'\n'字符,然后才执行刷新

  • 刷新其实就是告诉getchar(或者任何需要读取这个缓冲区的函数,比如scanf),现在你可以开始读取我保存的数据了.


于是现在缓冲区中保存的数据是[a,b,c,'\n'] ,注意缓冲区的最后会有一个换行符(因为你敲了Enter键). 好,现在开始读取数据:

  1. 第一次调用getchar,则读取缓冲区中的第一个数据a

  1. 第二次调用getchar,将会读取缓冲区中的第二个数据b

  1. 第三次调用getchar,将会读取缓冲区中的第三个数据c

  1. 第四次调用getchar,将会读取缓冲区中的最后一个数据'\n',也就是换行符.

如果你while循环来调用n次getchar(),就会按顺序读取缓冲区n次,就好像是按顺序读取数组一样.

如果getchar()发现缓冲区中没数据了,也就是说缓冲区的数据已经被读完了,没数据可读了.那么getchar函数会等你再次输入数据并且按下Enter执行刷新.

如果缓冲区有8个字符,你却只调用了5次getchar,那么缓冲区会剩下3个字符.因为你只读了5个字符.

可以实际编程上机尝试,懂得了原理,就会比较容易理解了.


为什么要使用缓冲区呢?

基本的设计考虑是节约时间,提高资源利用率.并且还附带一个额外功能:可以修改缓冲区的数据,修正错误的输入.

另外,我尝试从两个不同角度去解释一下缓冲区和getchar的机制,可能会有助于新手理解:

如果强行从"面向对象"上去理解,这个缓冲区的设计叫做"分离关注点":

  1. 键盘负责写入数据,允许修改(也就是回退删除),关注点是"写"

  1. getchar只负责按字符读取数据,关注点是"读"

如果强行用"设计模式"理解这个缓冲区设计,那就是一个简单的"观察者模式":

  1. 键盘生成缓冲区数据,负责写入数据,并在数据发生变化的时候通知订阅者(也就是执行刷新操作)

  1. getchar作为一个订阅了"缓冲区数据"的函数,当收到"刷新"指令的时候,就开始按顺序读取数据,每次只会读取缓冲区中的一个字符.

实际上,C语言中的getchar()函数相当于缓冲区的一个迭代器,专门用来读取缓冲区中的数据的.

猜你喜欢

转载自blog.csdn.net/qq_52049228/article/details/129469214
今日推荐