getchar的理解_输入缓冲区

按照代码逻辑,在提示输入密码“123456”之后,就应该弹出“请确认(Y/N)


这是怎末回事呢?


可以在调试之后打开监视,在监视窗口中,查看ret中的值。其值为’10’

用代码来解释解释为什莫没有达到自己想要的结果。

int main()

{

    int ret = 0;

    char password[20] = { 0
};

    printf("请输入密码:>");//输入“123456回车”

    scanf("%s",password);//输入函数,在输入缓冲区获取数据,读走“123456”,还剩下“\n”

    printf("确认密码(Y/N)");

    ret
= getchar();//输入函数,读走了缓冲区的“\n”,不再等待。

    if (ret == 'Y')//”\n!=’’Y”

    {

         printf("确认成功\n");

    }

    else

    {

         printf("确认失败");//就输出呵呵了

    }

    return 0;

}

看到这里大家就会知道了,监视里面的“10”其实就是ASCII表里面的“\n”.就是我们在输入密码是敲进去的。


怎样解决这个问题呢?

Getchar关键字来读取“\n”,如下图操作。

getchar的理解_输入缓冲区_02

那么问题来了,要是输入的是“12345 ABCD”这样的密码,这个输出结果又是怎样的呢?

getchar的理解_获取数据_03

这是因为scanf() 自会把空格前面的“123456”读走,用函数来标注看

int main()

{

    int ret = 0;

    char password[20] = { 0
};

    printf("请输入密码:>"); //输入123456 ABCD

    scanf("%s",password);//读走“123456”

    getchar();//读走‘\n’

    printf("确认密码(Y/N)");

    ret
= getchar();//读走了A

    if (ret == 'Y')//‘A’!=‘Y’

    {

         printf("确认成功\n");

    }

    else

    {

         printf("确认失败");

    }

    return 0;

}

怎莫解决这个问题呢?

123456 ABCD\N

用循环一直用getchar()去读字符,直至读取到\n即可。

getchar的理解_输入缓冲区_04