getchar输入问题2:输入缓冲区

发布于:2023-01-22 ⋅ 阅读:(159) ⋅ 点赞:(0)

首先写一段代码,这个代码是输入一个公司职员的公司编号,然后要求公司职员再次确认自己的编号是否正确,如果正确则确认成功,如果不正确则重新输入(有点像再次输入密码那样的)。

 

#include<stdio.h>
int TF(char x)
{
    char n[40] = {0};
    int R1 = 0;
    int c = 0;
    if(x == 'T')
    {
        printf("编号已确认\n");
    }
    else
    {
        printf("编号未确认,需要重新输入编号\n");
        printf("需要重新输入编号:");
        scanf("%s",n);
        getchar();
        printf("请再次确认您的编号:(T/F)");
        c = getchar();
        R1 = TF(c);
        getchar();
    }
    return 0;
}

int main()
{
    int a = 0;
    int R2 = 0;
    char number[40] = {0};
    printf("请输入您的公司职员编号:");
    scanf("%s",number);
    getchar();//应当在scanf的后面去加这个空的getchar;
    printf("请输入'T'or'F'来确认您的编号:");
    a = getchar();
    R2 = TF(a);
    return 0;
}

(代码很简单的利用了一下函数,主要是去说明getchar的回车-缓冲区的问题)

在《C程序设计》(谭浩强著)上有依次输入‘B','O','Y'三个字符的例题以及说明,也就是scanf和getchar这类输入函数在你输入某些东西的时候会自动检测出一片区域,该区域即输入缓冲区。以上述代码为例,如果"scanf("%s",number)"后没有"getchar();",在主函数中当我们依次输入‘012345’的时候,回车键键入之时,会出现这种情况:

可以看到,此时的编译器会直接输出“未确认”,这就是getchar等输入函数的原因了。

刚开始什么都没有输入的时候,输入缓冲区内什么也没,但当我们输入“012345”进去的时候,此时输入缓冲区内就有了一个虚拟的“012345”,我们这时按回车键想要往下走代码,但是回车键也会以'\n'的形式和‘012345’一起储存到输入缓冲区中。当我们要用的时候,以上述代码为例,scanf会取走空格或回车前的字符串即‘012345’,剩下一个‘\n‘,若此时不取走它,即没有getchar(),在上述的TF函数中,就会默认将这个‘\n‘输入到了判断中,即不会走if语句而是走了else语句,成功走向了深渊。

所以可以看到,我们需要一个空的getchar()去存放这个‘\n‘,以达到我们理想的目的。

但是从百度以及以前学过的经验得知,一串数字并不是字符串,“数字也是以字符串的形式来展现的”,所以当我们输入123W345的时候,也是会出现错误,更别提其中有空格如12457W 908这样的情况了,所以我们应该去改进--利用while循环(此处感谢b站比特鹏哥的解说,也算是一个笔记,如有侵权请告知)

我们在上述代码中的scanf后加一个while循环,当检测到\n时才会进行循环外的操作,具体代码可以改进为:

#include<stdio.h>
int TF(char x)
{
    char n[40] = {0};
    int gh = 0;
    int R1 = 0;
    int c = 0;
    if(x == 'T')
    {
        printf("编号已确认\n");
    }
    else
    {
        printf("编号未确认,需要重新输入编号\n");
        printf("需要重新输入编号:");
        scanf("%s",n);
        while((gh = getchar()) != '\n')
        {
            ;
        }
        printf("请再次确认您的编号:(T/F)");
        c = getchar();
        R1 = TF(c);
        getchar();
    }
    return 0;
}

int main()
{
    int a = 0;
    int R2 = 0;
    int ch = 0;
    char number[40] = {0};
    printf("请输入您的公司职员编号:");
    scanf("%s",number);
    while((ch = getchar()) != '\n')
    {
        ;//一个分号代表空语句,什么也不做
         //也就是找到了一个ch去循环不进行任何操作的处理‘\n‘前的数据
    }
    //应当在scanf的后面去加这个空的getchar;
    printf("请输入'T'or'F'来确认您的编号:");
    a = getchar();
    R2 = TF(a);
    return 0;
}

此时这个代码就写的差不多了。。。

ps:作者目前还处于C语言小白阶段,如有写的不对的地方还望指正。

本文含有隐藏内容,请 开通VIP 后查看