C语言scanf()缓冲区那些事

前言

今天在群里被一个群友的问题所吸引,他想实现小写字母转大写字母,然后可以无限循环这样

这是他写的代码,问大家程序为什么不会循环,他输入了a,是会输出A,但程序直接就退出了,不会让你输入下一次数据,我看了下代码,抛开写法,语法我看了一下,没问题呀,应该是会有循环的,怎么会没循环呢?但他坚持就是没循环,还发了视频,我有点懵,这语法没毛病呀,怎么会不循环,于是我自己也去试了一下,结果在下面

#include<stdio.h> 
int main()
{
    char n;
    int i;
    scanf("%c",&n);
    if(n>='a'&&n<='z') 
	{
        do
		{
        i=n;
        printf("%c",i-32);
        scanf("%c",&n);  
        }while(n>='a'&&n<='z');
    }
    return 0;
}

我的天?还真没循环让我们输入数据了,程序直接退出了?怎么回事啊?

然后我想了下,语法确实是没问题的,都能跑起来,既然程序直接退出,那应该是while里面的条件没有满足,所以我直接把目光锁定在scanf()语句上了,说到这个,自然就想到缓冲区,后面查阅资料以及以前自己的一些理解,找到了答案

原因

scanf()当"%c"接收字符类型时,不管是数字还是空格、回车、Tab 键都会被当做字符接收

然后scanf()又有一个毛病:假如你输入了a,那么在scanf缓冲区中是a 和 \n,然后stdin流读取的时候又只会读走a,赋值给相应的变量,\n还留在缓冲区中,前面说了,换行是会被当做字符给读走的,所以当进入到循环里的时候,这个scanf()直接就把缓冲区的\n给读走了,赋值给了n,那么n进入到while条件判断,自然就不会成立,所以程序直接退出

解决方法

每次scanf()之后都清空一下缓冲区,可以用以下两个函数

①fflush(stdin);
②getchar();

扫描二维码关注公众号,回复: 15369628 查看本文章

案例

听过了上面的讲解,做个小题目,问:下面程序中,我们有几次输入数据的机会?

假如我输入了csdn,输出是什么

int main()
{
    char n,n1;
    scanf("%c",&n);
    scanf("%c",&n1);
    printf("%c",n1);
    return 0;
}

答案是1次输入的机会,输出是s,因为不管你第一次输入的是什么,不更新缓冲区的话,下一次scanf()会自动读取,可能是换行,空格或者输入内容的剩余部分符合字符的内容

本来在学习,看群友发了问题,自己就研究了半小时,也挺有意思,很有收获

这篇文章对大家有收获的话,就点个赞吧 ~

猜你喜欢

转载自blog.csdn.net/m0_71741835/article/details/128045719
今日推荐