【C语言】使用 getchar 与 scanf 出现的一些问题

文章目录

  • 一、scanf 在缓冲区获取数据的一些问题

    • 1、scanf 不会拿缓冲区里的 \n

    • 2、scanf 只会拿空格前的数据

  • 二、getchar 在缓冲区获取数据的一些问题
  • 三、scanf 和 getchar 用在一起会出现一些易出错的问题
  • 四。解决问题

前言

给刚入门的兄弟推荐一个新手也能上手的刷题网站:

LeetCode: https://leetcode-cn.com/problemset/all/


一、先了解 scanf 在缓冲区获取数据的一些问题

键盘输入的信息暂存在缓冲区,scanf 在缓冲区中获取信息(再存到相应变量中)

1、scanf 不会拿缓冲区里的 \n

但是当我们输入完一串数据(如123456)后会按下回车键,在缓冲区就会变成:123456\n ,按下回车键的与此同时 scanf 也开始从缓冲区中获取数据(拿数据),待 scanf 拿完数据后,缓冲区会剩下 \n 。先了解此一原则

2、scanf 只会拿空格前的数据

etc. char arr[20]={0};

scanf("%s",arr);

这时运行起来,我们在控制台输入:123456 abc //注意有空格

回车后缓冲区立马出现 :123456 abc\n ,随即 scanf 从中获取数据(拿数)

剩下的是: abc\n //左侧 abc\n 前的下划线表示空格

二、了解 getchar 在缓冲区获取数据的一些问题

getchar ( ) 会直接从缓冲区中获取数据,并且只拿一个字符,这是缓冲区里有数据的情况;如果缓冲区中没数据,getchar 就会等待

第二点虽然少,但是要求理解(这当然不是理由)

三、所以当 scanf 和 getchar 用在一起会出现一些易出错的问题

当 scanf 刚取完值后,后面没清空缓冲区直接用 getchar ( ) 获取我们新输入的字符,这时 getchar 获取了缓冲区原有的一个字符后不再获取,获取的不是我们输入的字符

etc. (没有清空缓冲区的错误例子)

char arr [20] = {0};

printf("输入密码:")

scanf("%s", arr);

printf("确认密码(T / F):")

int a = getchar ();

if (a = ' T ')

{

printf("密码正确");

}

else

{

printf("密码错误");

}

运行起来发现不管输入什么都直接是密码错误:

四、解决办法

既然是没有清空缓冲区而出现的问题,那就清空缓冲区

用 getchar () 来取虽然一个 getchar 只取一个,那就用 while 让它一直取到空位置

在 scanf 取完数后加入一个 while 循环:

int empty = 0;                                   //先定义一个常量

while( ( empty=getchar() ) != ' \n ' )

{

getchar();                                         //这样这里的 getchar 在缓冲区取的数就会被忽略

}                                                       //也不储存在empty中(被扔掉)

运行结果:


献给新手的其他文章目录(希望对你有所帮助)
一、【C语言】初学者写基础代码的基本步骤_Meiyourou.c的博客-CSDN博客_如何开始写代码二、关于scanf,局部与全局变量的理解_Meiyourou.c的博客-CSDN博客三、【C语言】生命周期和作用域_Meiyourou.c的博客-CSDN博客_c语言生命周期四、【C语言】字符串及求字符串的长度_Meiyourou.c的博客-CSDN博客五、【C语言】条件操作符,逗号操作符,操作符 ( ) 、[ ]_Meiyourou.c的博客-CSDN博客六、【C语言】操作符 ~ ,二进制位按位取反_Meiyourou.c的博客-CSDN博客七、【C语言】static_Meiyourou.c的博客-CSDN博客八、【C语言】转义字符_Meiyourou.c的博客-CSDN博客九、【C语言】if 语句的相关内容_Meiyourou.c的博客-CSDN博客十、【C语言】 switch 分支语句_Meiyourou.c的博客-CSDN博客


最后的最后,送大家一句话:

诸位不免摘一朵野花,更比夕阳......

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meiyourou.c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值