前言:【C语言基础】系列文章是根据C Primer Plus(第五版)中文版一书内容加以逻辑性概括。记录自己的成长。
字符输入输出主要介绍讲两个函数:getchar()和putchar()以及一个需要格外注意的知识点。
字符输入/输出
- getchar()和putchar()都是单字符I/O,即一次只能输出一个字符。
1、getchar()
函数定义:
int getchar();//需要注意的是getchar()函数没有参数,并将获得字符返回
函数调用:
与scanf()不同,getchar()会读取每一个字符,包括空格、制表符和换行符。而scanf()则会跳过这些字符。char ch;
ch=getchar();//将获得的字符返回给ch
2、putchar()
函数定义:
int putchar(int ch);
函数调用:
例如:putchar('A');
3、getchar()与scanf()混合使用
在介绍该部分时,首先要明确缓冲区概念。
若干数据以数据块的形式发送效率比较高是缓冲区存在的意义。
(1)缓冲区
具体参照C primer plus(第五版)中文版P189页。
1)非缓冲
输入字符立即回显是非缓冲。回显的含义是:对正在等待的程序立即变成可用。
2)缓冲
输入数据被存放在临时存储区中,按下回车键键入的字符对程序变成可用。
- 完全缓冲
缓冲区满时被清空。
- 行缓冲
遇到换行字符时清空缓冲区。键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。
(2)getchar()与scanf()混合使用
与scanf()不同,getchar()会读取每一个字符,包括空格、制表符和换行符。而scanf()则会跳过这些字符。因此两者不能很好的混合在一起用。
例如下面程序:
#include <stdio.h> void display(char cr,int lines,int width) { int row,col; for(row=1;row<=lines;row++) { for(col=1;col<=width;col++) putchar(cr); putchar('\n'); } } int main() { int ch; int rows,cols; while((ch=getchar())!='\n') { scanf("%d%d",&rows,&cols); display(ch,rows,cols); } return 0; }<span style="color:#ff0000;"> </span>
由于scanf()将换行符留在输入队列当中,由于getchar()并不跳过换行符,在下一循环当中该换行符由getchar()读出,并赋给ch,而ch为换行符正是循环终止的条件。