重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、scanf 在缓冲区获取数据的一些问题
创新互联建站致力于互联网网站建设与网站营销,提供成都网站设计、成都做网站、网站开发、seo优化、网站排名、互联网营销、微信小程序定制开发、公众号商城、等建站开发,创新互联建站网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。1、scanf 不会拿缓冲区里的
2、scanf 只会拿空格前的数据
给刚入门的兄弟推荐一个新手也能上手的刷题网站:
LeetCode: https://leetcode-cn.com/problemset/all/
键盘输入的信息暂存在缓冲区,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元起,快前往官网查看详情吧