《C语言及程序设计》实践参考——总是多一次?

返回:贺老师课程教学链接  项目要求


【项目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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值