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();

案例

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

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

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

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值