【C语言】使用getchar与scanf出现的一些问题-创新互联

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

    创新互联建站致力于互联网网站建设与网站营销,提供成都网站设计、成都做网站、网站开发、seo优化、网站排名、互联网营销、微信小程序定制开发、公众号商城、等建站开发,创新互联建站网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。
    • 1、scanf 不会拿缓冲区里的

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

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

前言

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

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


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

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

1、scanf 不会拿缓冲区里的

但是当我们输入完一串数据(如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的博客-博客_如何开始写代码二、关于scanf,局部与全局变量的理解_Meiyourou.c的博客-博客三、【C语言】生命周期和作用域_Meiyourou.c的博客-博客_c语言生命周期四、【C语言】字符串及求字符串的长度_Meiyourou.c的博客-博客五、【C语言】条件操作符,逗号操作符,操作符 ( ) 、[ ]_Meiyourou.c的博客-博客六、【C语言】操作符 ~ ,二进制位按位取反_Meiyourou.c的博客-博客七、【C语言】static_Meiyourou.c的博客-博客八、【C语言】转义字符_Meiyourou.c的博客-博客九、【C语言】if 语句的相关内容_Meiyourou.c的博客-博客十、【C语言】 switch 分支语句_Meiyourou.c的博客-博客


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

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:【C语言】使用getchar与scanf出现的一些问题-创新互联
网站网址:http://pwwzsj.com/article/djseid.html