《C语言及程序设计》实践参考——总是多一次?
来源:互联网 发布:mac 鼠标右键不能用 编辑:程序博客网 时间:2024/05/22 17:02
返回:贺老师课程教学链接 项目要求
【项目2-总是多一次?】
先阅读下面的程序。这样的结构,经常用于重复性工作。执行一次程序要完成的工作后,由操作人员选择,决定是否还来一遍。
通过单步的方式,找出问题的原因,并自行查找资料,找出解决的办法。
先阅读下面的程序。这样的结构,经常用于重复性工作。执行一次程序要完成的工作后,由操作人员选择,决定是否还来一遍。
#include<stdio.h>void dosomething(int *p);int main( ){ char choice='y'; int n=0; while(choice!='N' && choice!='n') { dosomething(&n); printf("按 N 退出,其他键继续...."); scanf("%c", &choice); //用choice=getchar();也一样 } return 0;}void dosomething(int *p) //完成特定的业务{ *p+=1; //本例中传地址, *p即n printf("第%d次完成业务!\n", *p);}阅读程序,发现在不退出时,想继续一次业务,却……,如图:
通过单步的方式,找出问题的原因,并自行查找资料,找出解决的办法。
[参考解答]
1. 断点设置在第7行,要在每次执行中,观察这个choice是怎么搞的,连个'N'者找不准?
2. 执行到了第11行,scanf处输入Y
3. 继续Next Line,发现choice挺乖的,值为'Y‘。当然,while循环得以进入,现在已经要再来一次scanf了,期望再次从键盘上输入你的选择……
4. Next line后,你失望了,程序没有停下来让你输入,而是再次到了第7行的while语句。这时,看chioce的值!没错,ASCII值为10,对应的是'\n'。
5. 想想,刚才输入完了Y后,还输入了一个回车。系统当你输入了两个符号,一个Y,另一个就是回车。上一次循环,用Y,这一次,用回车。(原理:在输入输出时,系统分配一段内存区域,称作为“缓存区”,将用于输入输出的内容就放在这段区域中。现在说输入的问题。当缓存区空了后,会等待用户从键盘输入,而如果缓存区中“有货”,就直接用了。对于本文中的问题,输入的Y和回车放在缓存区中,取出了Y,但回车还在,下一次时,就直接拿出回车来用了。)至此,问题已经大白于天下。
如何改程序?
希望缓存区中剩余的回车不要影响下一次,于是,要在下一次执行scanf前,将缓存区里的“残存物”(这个坏蛋!)清理掉。用fflush(stdin);,fflush是用于清空缓存区的函数,stdin代表标准输入(键盘),清除的是键盘缓存区。
为找感觉,运行程序要求你输入时,随便多输入几个符号,你看到的是
(你可以思考了。)
修改后的main函数是:
int main( ){ char choice='y'; int n=0; while(choice!='N' && choice!='n') { dosomething(&n); printf("按 N 退出,其他键继续...."); fflush(stdin); //读入字符前,常要清空“输入缓存区” scanf("%c", &choice); //用choice=getchar();也一样 } return 0;}
1 0
- 《C语言及程序设计》实践参考——总是多一次?
- 《C语言及程序设计》实践参考——输出点阵图
- 《C语言及程序设计》实践参考——电阻并联
- 《C语言及程序设计》实践参考——正差值
- 《C语言及程序设计》实践参考——发工资
- 《C语言及程序设计》实践参考——玩数字
- 《C语言及程序设计》实践参考——坐标转换
- 《C语言及程序设计》实践参考——构造菜单
- 《C语言及程序设计》实践参考——投票表决器
- 《C语言及程序设计》实践参考——成绩等级
- 《C语言及程序设计》实践参考——求阶乘
- 《C语言及程序设计》实践参考——另类求和
- 《C语言及程序设计》实践参考——Bessel函数
- 《C语言及程序设计》实践参考——转着圈加密
- 《C语言及程序设计》实践参考——血型统计
- 《C语言及程序设计》实践参考——大奖赛计分
- 《C语言及程序设计》实践参考——打豆豆
- 《C语言及程序设计》实践参考——完数
- [LeetCode]Longest Common Prefix
- Facebook的开源动画库popAnimation
- 《C语言及程序设计》实践参考——sin泰勒展式中的错误
- linux之软链接,硬链接
- The 12th Zhejiang Provincial Collegiate Programming Contest
- 《C语言及程序设计》实践参考——总是多一次?
- .Net——动态调用方法
- 王家林 构建spark集群
- ZOJ3872:Beauty of Array(浙江省赛2015)
- 第8周项目2Time类中的运算符重载
- 十大前端开发框架
- JavaWEB__HttpSession简单总结及小应用
- 不上火勤眨眼远离干眼症
- 无穷大技巧设置