18.28 getchar()函数与缓冲区问题
一个关于使用链表增加删除人名的小程序,在使用getchar()函数,得到输入的菜单选项时,出现了问题,现记录如下:
【菜单部分代码如下:】
#include <stdio.h>int main(int argc, char * argv [ ]) {char cOpt;while(1){ print();cOpt = getchar();switch(cOpt) /* switch里的变量只能是整型或字符型 */{case 'l':{list_name();break; }case 'a':{add_name();break;}case 'd':{del_name();break;}case 'x':{return 0;break;}default:{break;}}}return 0; }
【错误现象:】
输入菜单选项时,多输出一次菜单。
【解决问题过程:】
1.我在每一个语句后增加的打印语句。
printf("1. test\n");
发现每次都会多执行一次default语句。
2.查看cOpt输出结果
cOpt = getchar(); printf("1. cOpt = 0x%x\n", cOpt); switch(cOpt) {… }
发现cOpt的值有0xa,这是换行符的ASCII码。
通过对缓冲区的研究发现以下结论:
我的输入被放入了输入缓冲区,这里的回车操作,既有确定作用又是字符,所以回车'\n'它也跟着进了缓冲区,这个时候getchar()会从stdin流缓冲区中读取刚才的输入,一次只读一个字符,所以字符‘l’就被拿出来了,赋值给了cOpt,然后使用switch选择菜单项执行,这是第1次显示菜单栏。字符‘l’被取出的同时,也被缓冲区释放了,而此时缓冲区还有回车('\n')。所以在while(1)第2次循环时,根本不需要输入就读出了回车('\n')字符,赋值给cOpt,在switch里判断后回车('\n')字符属于未定义的,必然要执行default分支。此时,回车字符也被缓冲区释放了,所以再次调用getchar时,程序就等着用户按键。
所以,getchar的调用就是直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。
【解决方案:】
【法1:】知道原因后,我在switch前的cOpt = getchar();后增加下列语句
if (cOpt == '\n') {cOpt = getchar(); }
【法2:】
#include <stdio.h>int main(int argc, char * argv [ ]) {char cOpt;while(1){ print(); /* 解决方案2 */do{cOpt = getchar();}whiel((cOpt != 'l') && (cOpt != 'a') && (cOpt != 'd') && (cOpt != 'x'))if (cOpr == 'l'){list_name();}else if (cOpr == 'a'){ShowPrePage(); }else if (cOpr == 'd'){del_name(); }else if (cOpr == 'x'){return 0; }}return 0; }
目的是为了释放回车字符,使程序跳过对回车字符的操作。
补充:
缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。
1、全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。
2、行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。
3、不带缓冲
也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
缓冲区的刷新
缓冲区会在以下三种情况下被刷新:
1、缓冲区满
2、执行flush刷新缓冲区的语句
3、程序正常结束。
转载于:https://www.cnblogs.com/baixu/p/11212216.html
18.28 getchar()函数与缓冲区问题相关推荐
- 详解getchar()函数与缓冲区
1.首先,我们看一下这段代码: 它的简单意思就是从键盘读入一个字符,然后输出到屏幕.理所当然,我们输入1,输出就是1,输入2,输出就是2. 那么我们如果输出的是12呢? 它的输出是1. 这里我们先简单 ...
- getchar函数与缓冲区的细节问题
目录 一.getchar: 1.getchar 使用方法: 2.getchar 常与 while 结合 二.getchar,scanf与缓冲区 1.缓冲区的概念 2.scanf与getchar()对待 ...
- C语言中getchar()函数的详解
文章目录 关于getchar()函数的基本作用 getchar()函数基本案例 在循环当中的getchar() getchar()函数的作用 清理缓冲区中多个字符 关于getchar()函数的基本作用 ...
- c语言scanf可以和putchar,C语言getchar和putchar和scanf函数_缓冲区
C语言getchar和putchar和scanf函数_缓冲区 1.getchar int getchar ( void ); Get character from stdin Returns the ...
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...
- getchar()函数的一些知识
目前就我学习的getchar()知识感觉都是比较零散的,因此在这试图归类一下,当然肯定有不完善的地方,还望海涵 1.首先,提到getchar()函数就必须提到缓冲区的概念,即在黑色的交互界面我们用键盘 ...
- C/C++ getchar函数 - C语言零基础入门教程
目录 一.getchar 函数简介 1.getchar 原理 2.getchar 函数声明 3.getchar 使用场景 二.getchar 函数使用 三.getchar 函数妙用 四.猜你喜欢 零基 ...
- C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)
目录 一.前言 二.什么是getchar()函数 三.getchar()函数的返回类型与机制 四.连续单个字符串 (代码演示) 五.getchar()函数其他用法,实战演练(重点) (1)按照题目写出 ...
- c、c++的getchar()函数
一.getchar简介() getchar()是C语言中的函数,C++中也包含了该函数.getchar()函数只能接收一个字符,其函数值就是从输入设备获取到的字符. 二.函数原理 (1)getchar ...
最新文章
- linux 物理内存统计,说说free命令 + Linux可用内存统计方法
- java字符串转日期_JAVA字符串转日期或日期转字符串
- 混合运算lcd显示_各界巨头寄予厚望 MicroLED靠什么成为显示屏的未来
- div内的button的click会触发两次(防止事件冒泡)
- 前端学习(3107):react-hello-jsx小练习2
- Python程序输入一个字符串并查找总数的大写和小写字母
- Launch custom android application from android browser
- Redmi K50电竞版卖点投票:120W神仙秒充一骑绝尘
- java创建线程池几种方式_Java 创建线程池两种不同方法的比较
- Android-界面-布局
- 微型计算机中硬盘工作时 应注意避免,1硬盘工作时应特别注意避免(B)
- 容积卡尔曼滤波算法 CKF
- 安装Realtek RTL8111/RTL8168网卡驱动详解(error~eth0:no such device)
- 机器学习系列5---偏差和方差分解
- Class6 基于ECS和NAS搭建个人网盘
- JavaScript系列---for循环(打印星星)
- comsol函数的使用(入门级教程)
- 小程序微信小程序设计登录页面
- 处理器博通还是高通比较好_苹果手机基带高通还是Intel好?iPhone查看基带生产商厂家方法...
- 去掉office 2007 正版验证