一个关于使用链表增加删除人名的小程序,在使用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()函数与缓冲区问题相关推荐

  1. 详解getchar()函数与缓冲区

    1.首先,我们看一下这段代码: 它的简单意思就是从键盘读入一个字符,然后输出到屏幕.理所当然,我们输入1,输出就是1,输入2,输出就是2. 那么我们如果输出的是12呢? 它的输出是1. 这里我们先简单 ...

  2. getchar函数与缓冲区的细节问题

    目录 一.getchar: 1.getchar 使用方法: 2.getchar 常与 while 结合 二.getchar,scanf与缓冲区 1.缓冲区的概念 2.scanf与getchar()对待 ...

  3. C语言中getchar()函数的详解

    文章目录 关于getchar()函数的基本作用 getchar()函数基本案例 在循环当中的getchar() getchar()函数的作用 清理缓冲区中多个字符 关于getchar()函数的基本作用 ...

  4. c语言scanf可以和putchar,C语言getchar和putchar和scanf函数_缓冲区

    C语言getchar和putchar和scanf函数_缓冲区 1.getchar int getchar ( void ); Get character from stdin Returns the ...

  5. getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...

    2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...

  6. getchar()函数的一些知识

    目前就我学习的getchar()知识感觉都是比较零散的,因此在这试图归类一下,当然肯定有不完善的地方,还望海涵 1.首先,提到getchar()函数就必须提到缓冲区的概念,即在黑色的交互界面我们用键盘 ...

  7. C/C++ getchar函数 - C语言零基础入门教程

    目录 一.getchar 函数简介 1.getchar 原理 2.getchar 函数声明 3.getchar 使用场景 二.getchar 函数使用 三.getchar 函数妙用 四.猜你喜欢 零基 ...

  8. C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

    目录 一.前言 二.什么是getchar()函数 三.getchar()函数的返回类型与机制 四.连续单个字符串 (代码演示) 五.getchar()函数其他用法,实战演练(重点) (1)按照题目写出 ...

  9. c、c++的getchar()函数

    一.getchar简介() getchar()是C语言中的函数,C++中也包含了该函数.getchar()函数只能接收一个字符,其函数值就是从输入设备获取到的字符. 二.函数原理 (1)getchar ...

最新文章

  1. linux 物理内存统计,说说free命令  + Linux可用内存统计方法
  2. java字符串转日期_JAVA字符串转日期或日期转字符串
  3. 混合运算lcd显示_各界巨头寄予厚望 MicroLED靠什么成为显示屏的未来
  4. div内的button的click会触发两次(防止事件冒泡)
  5. 前端学习(3107):react-hello-jsx小练习2
  6. Python程序输入一个字符串并查找总数的大写和小写字母
  7. Launch custom android application from android browser
  8. Redmi K50电竞版卖点投票:120W神仙秒充一骑绝尘
  9. java创建线程池几种方式_Java 创建线程池两种不同方法的比较
  10. Android-界面-布局
  11. 微型计算机中硬盘工作时 应注意避免,1硬盘工作时应特别注意避免(B)
  12. 容积卡尔曼滤波算法 CKF
  13. 安装Realtek RTL8111/RTL8168网卡驱动详解(error~eth0:no such device)
  14. 机器学习系列5---偏差和方差分解
  15. Class6 基于ECS和NAS搭建个人网盘
  16. JavaScript系列---for循环(打印星星)
  17. comsol函数的使用(入门级教程)
  18. 小程序微信小程序设计登录页面
  19. 处理器博通还是高通比较好_苹果手机基带高通还是Intel好?iPhone查看基带生产商厂家方法...
  20. 去掉office 2007 正版验证

热门文章

  1. Python爬虫(二)——豆瓣图书决策树构建
  2. Centos 7.4 安装ipython和mysql-python遇到的问题
  3. CSS hack浏览器兼容一览表
  4. 一步一步教你加密解密技术——软件保护技术
  5. docker与虚拟机的对比
  6. shell脚本不暂停进程,暂停几秒执行下一条shell命令
  7. dos拼接字符串以及截取字符串
  8. ViewPager 实现页面左右滑动的简单案例1
  9. 它抢不走程序员的饭碗,但是会让一部分人瑟瑟发抖
  10. 敢不敢模拟超过 5 万的并发用户?