C语言清除缓冲区

 例1

当我们设计一个密码输入系统,在密码输入完成后,并输入Y or N进行确认。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char password[20];
    printf("输入密码\n");
    scanf("%s", &password);
    printf("请确认密码(Y/ N)\n");
    char ch = getchar();
    if (ch == 'Y')
        printf("确认成功\n");
    else
        printf("确认失败\n");
    return 0;
}

这样的编码乍一看没有任何问题,但是实际运行起来以后会发现,我并没有输入Y or N,系统就自己运行起来了。

 这是因为当我们使用scanf或getchar()这样的函数时,在键盘和函数之间存在一个缓冲区,那么当我们在第一次输入完密码时,输入的不仅是密码321还有一个回车键’\n‘。scanf函数读取到321放入passward中,缓冲区里还剩下了一个回车键也就是‘\n’,那么在进行确认判断时,getchar()直接读取缓冲区里面的\n,就会导致程序继续跑起来,给出一个错误的结果。那么我们是否只要把这个\n拿走就可以了呢?只要在进行确认判断的前面加上一个getchar()函数把\n读取掉,那么缓冲区里面就没有任何东西,程序就会等待输入Y or N。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char password[20];
    printf("输入密码\n");
    scanf("%s", &password);
    getchar();
    printf("请确认密码(Y/ N)\n");
    char ch = getchar();
    if (ch == 'Y')
        printf("确认成功\n");
    else
        printf("确认失败\n");
    return 0;
}

 现在看起来我们做的已经很完美了,但是事实真的是这样吗,如果当我输入的密码里面存在空格的话,又会是什么情况呢?

 我们可以看到在这里又出现了上面的情况,可是缓冲区里面的\n不是应该被getchar()读取了吗。这是因为scanf函数在读取字符串时遇到空格就会不在进行读取。那么就导致缓冲区里剩下了‘ as3’,而getchar()函数一次只能读取一个字符,这时候我们就应该用一个循环把缓冲区清除。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char password[20];
    printf("输入密码\n");
    scanf("%s", &password);
    getchar();
    printf("请确认密码(Y/ N)\n");

    char ch = 0;
    while ((ch = getchar()) != '\n')
        ;

    if (ch == 'Y')
        printf("确认成功\n");
    else
        printf("确认失败\n");
    return 0;
}

通过一个while循环加一个空语句,它的意思是如果getchar读取到的字符不是'\n',就让getchar函数继续读取缓冲区,直到读取到\n为止,那么此时的缓冲区也就清除干净了。

空语句

空语句不同于表达式语句、函数调用语句等功能性语句,它什么都不需要做,但是有时候我们需要一条空语句。就像这里,我们需要的是while函数,但是如果没有空语句的话while函数只能够运行一次。

例2

判断输入的字符是不是字母,请编程实现。

输入描述

多组输入,每一行输入一个字符。

输出描述:

针对每组输入,输出单独占一行,判断输入字符是否为字母,输出内容详见输出样例。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    char ch;
    while (scanf("%c", &ch) == 1)
    {
        if (ch > 64 && ch < 91)//或者写ch>'A'&&ch<'Z'
        {
            printf("%c is an alphabet.\n", ch);
        }
        else if (ch > 96 && ch < 123)
        {
            printf("%c is an alphabet.\n", ch);
        }
        else
            printf("%c is not an alphabet.\n", ch);
        getchar();
    }
        
    return 0;
}

像这里的getchar就是读取\n的作用。

 而如果没有getchar函数读取缓冲区的话,输出的结果就是这样的

 因为处在while循环中,scanf函数会读取两次,第一次是输入的字符,第二次就是\n,就会导致输出错误。

结语

当我们遇到一些问题的时候,可以多从计算机的角度出发,去分析每一个语句产生的效果,从而找到解决问题的最优途径。心若不欺,必然扬眉吐气。遇到问题不要屈服,努力地去克服它,终会有扬眉吐气的一刻。

码字不易,喜欢就给个一键三连叭。如有错漏之处还请多多指正。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值