《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
原创粉丝点击