关于利用scanf()函数做为do-while循环条件的分析

首先来看一段测试程序:
/****************************
程序名称:测试do-while循环
功能说明:让用户输入字符,来判断是否进行下次循环
*****************************/
#include <stdio.h>
#include <ctype.h>


int main(void)
{
    char flag;            //设置标志位
    int loop_var=0;       //输出变量
    do
    {
        printf("loop %d \n",loop_var++);  
        printf("继续下次循环 (y/n)?\n"); //提示用户输入选择
        scanf("%c",&flag);
       
    }while(toupper(flag)=='Y');//如果输入y或Y进行下次循环
    return 0;
}


这段程序在首次运行以后,会立刻输出:


loop0
继续下次循环 (y/n)?


来提示用户进行选择,如果用户输入的是y或Y,那会进入下次循环,并输出:


loop1 
继续下次循环 (y/n)?


但是第二次循环一过,程序运行结束。这个程序本意,应该是只要用户输入的是y或Y,应该可以持续循环下去。可是第二次循环后就退出程序了。为什么会这样呢,通过分析利用重定向符进行字符输入后得到的结果,个人认为是这样:当用户输入y或Y以后,按下回车确定输入结束,这样,相当于输入了两次字符一个y或Y和回车符,所以进行第三次判断由于输入的不y或Y,while的条件不成立,所以程序结束运行。


通过此次小程序的测试,得到的结论为:在do-while循环里,用scanf()函数得到的用户输入做为条件判断时,条件成立的情况下,也只能再循环一次,因为回车会被算做第二次输入判断的条件。


解决方法:由于scanf()函数做为输入条件的判断,所以问题本身是出在这个函数上。通过了解scanf()函数,得知,scanf()函数获得的数据是保存在键盘缓冲区中,并且是在键盘缓冲区查找输入数据,而不是直接从键盘上读取数据,用户输入的所有数据都会保存在缓冲区里,所以第二次循环的条件会直接从缓冲区读取数据。因为第一次用户的输入是字符加回车。所以回车符成为了第二次循环条件判断的字符。明白了问题所在,那么要让程序达到本意,就可以这么做,在取得用户输入后,清除缓冲区。标准输入和输出有两个缓冲区:stdin用于输入,stdout用于输出。要清除键盘输入缓冲区,只要清除stdin就可以了,如何清除呢?使用函数fflush(),这个函数包含在stdio.h里。


下面是更改后的代码:


/****************************
程序名称:测试do-while循环(修改版)
功能说明:让用户输入字符,来判断是否进行下次循环
*****************************/
#include <stdio.h>
#include <ctype.h>


int main(void)
{
    char flag;            //设置标志位
    int loop_var=0;       //输出变量
    do
    {
        printf("loop %d \n",loop_var++);  
        printf("继续下次循环 (y/n)?\n"); //提示用户输入选择
        scanf("%c",&flag);
        fflush(stdin);  //清除键盘数据缓冲区


    }while(toupper(flag)=='Y');//如果输入y或Y进行下次循环
    return 0;
}


----------------------------------------------------------------------
参考书籍:C语言入门经典第四版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值