想要了解getchar
则先认识scanf和“输入缓存(缓冲)区”
scanf的功能:
将从键盘输入的数据,通过输入控制符转化为规定格式的数据,然后存入特定的地址等待读取。
接下来我们用一个比较复杂的例子来看一下具体的过程:
scanf("%d%c%c%d%f%d%c", &a, &b, &c, &d, &e, &f, &g);
此时你在键盘中的输入为:123ab21空格19.2空格12c回车(注意当从键盘键入回车时不仅是结束当前输入语句还将一个回车符压入了缓冲区)
第一个控制符为整型,此时缓冲区弹出数字123并存储在a指示的地址内
第二个控制符为字符型,此时缓冲区弹出字符'a'并存储在b指示的地址内
第三个控制符为字符型,此时缓冲区弹出字符'b'并存储在c指示的地址内
第四个控制符为整型,此时缓冲区弹出数字21并存储在d指示的地址内
第五个字符浮点型,此时缓冲区弹出转义字符空格非浮点型,缓冲区继续弹出浮点数19.2并存储在e指示的地址内
第六个控制符为整型,此时缓冲区弹出转义字符空格非整型,缓冲区继续弹出数据12并存储在f指示的地址内。
第七个控制符为字符型,此时缓冲区弹出字符'c'并存储在g指示的地址内。
没有新的控制符,此时读取结束。但需要记住,此时缓冲区内还有一个转义字符回车。

scanf()格式控制符汇总
| 格式控制符 | 说明 |
| %c | 读取一个单一的字符 |
| %hd、%d、%ld | 读取一个十进制整数,并分别赋值给 short、int、long 类型 |
| %ho、%o、%lo | 读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型 |
| %hx、%x、%lx | 读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型 |
| %f、%lf | 读取一个十进制形式的小数,并分别赋值给 float、double 类型 |
| %e、%le | 读取一个指数形式的小数,并分别赋值给 float、double 类型 |
| %g、%lg | 既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型 |
| %s | 读取一个字符串(以空白符为结束) |
缓存区概念

在运行窗口的时候,缓存区内没有数据,scanf函数等输入函数正在等待键盘输入字符串来读取数据,则运行窗口的光标一直在闪烁。
当键盘输入一串字符串后(以回车结尾),这串字符串(包括回车键)则会进入到一个特殊的计算机空间——“缓存区”,用来暂时保存输入或输出的数据。
而格式控制符,就是来控制scanf函数如何读取存放在“缓存区”的数据。
注意遇到以下情况可以判定输入结束(在字符串末尾处):
1)回车(\n换行符),空格(空白符),tab键(制表符)
2)达到输入位宽
3)遇到非法字符
认识了scanf函数和缓存区的概念,接下来就可以认识getchar函数了
getchar()
最容易理解的字符输入函数是 getchar(),使用时,它给予我们的反馈则是读取一个“单一”的字符,那么它就是scanf(“%c”, c)的替代品,除了更加简洁,没有其它优势了;或者说,getchar() 就是 scanf() 的一个简化版本。
文章详细介绍了scanf函数的工作原理,通过一个示例解释了如何从输入缓存读取数据,并列举了scanf的各种格式控制符。接着,提到了缓存区的概念,以及何时判定输入结束。最后,介绍了getchar函数作为简单的字符输入函数,是scanf的简化版本。
4819





