scanf函数

scanf()函数最容易出问题的地方就是

格式化读取与缓冲区的问题。

结合代码来看:

#include<stdio.h>

int main() {
	int a=1,b=1;
	char c='a';
	printf("before:\n");   
    printf("%d,%d,%c\n",a,b,c);   //输出初始化状态
    
    scanf("%d%d",&a,&b);
    
    //清空缓冲区
    //fflush( stdin );
    //scanf("%*[^\n]%*c");
    
    scanf("%c",&c);

    printf("%d,%d,%c\n",a,b,c);   //输出之后的变化
}

一开始输出1,1,a这没问题。
在这里插入图片描述

scanf()从缓冲区格式化读取东西,如果缓冲区不为空,无需等待用户输入,直接从缓冲区继续读取。

  • 当我输入2 b时,结果如下:
    在这里插入图片描述
    分析:

    scanf("%d%d",&a,&b);

    想要读取两个整型数据,先读取到2符合,存到了a;然后读到空格,忽略;(直接输2b结果一样)。在读取b字符型不是整型,退出scanf()函数,b变量并未被赋值。
    此时,缓冲区中剩余字符b。

    然后执行

    scanf("%c",&c);

    因为缓冲区中有字符b,直接读取b,存到了c变量。

  • 清空缓冲区:
    代码中加入下列两个函数之一都可以清空缓冲区。

    fflush( stdin );

    scanf("%[^\n]%c");

    在这里插入图片描述
    输入2b之后,缓冲区被清,第二个scanf()函数等待用户输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值