百变Scanf()的千层套路
一、格式化输入
1、%c:
scanf()中最为诡计多端的就是字符类型的输入了,下面编写了一个简易程序,来看看scanf()是怎么处理字符的吧~
#include<stdio.h>int main(void)
{int s;char c;while (1){s = scanf_s("%c",&c);printf("此时存入的字符是:%c\n", c);printf("scanf_s返回值是:%d\n",s);}return 0;
}
(注:该程序仅为测试用,故循环没有出口。)
1)char类型占一字节,故每次不管输入多少字节,只能存入一个字节,返回值仍为1,剩余的不删除,存在缓冲区中,留着下次输入用;
2)char不跳过空白字符(退格,空格,回车),皆可存入且输出,返回值皆为1;
3)插入不能直接读取负数,会把负号和数字分开存入;
4)因为中文占两字节,所以无法成功存入,但会被拆分成两个字节分别存在参数和缓冲区中,返回值仍为1;
2、%d:
#include<stdio.h>int main(void)
{int s,d;char c;while (1){s = scanf_s("%d",&d);printf("此时存入的数字是:%d\n", d);printf("scanf_s返回值是:%d\n",s);}return 0;
}
1)输入字符:存在两种情况
情况一:int d未初始化,程序将一个溢出值赋给d(我们甚至还可以对带着溢出值的d进行操作),scanf返回值为0;
情况二:假如我们给int d一个初始值,我们会发现,数值d的值不会被该溢出值改变,scanf返回值为0。
值得注意的是,无论d的值有没有被溢出值改变,无效字符q都会被扔到缓冲区中,这点我们会在下文混合输入字符和数字时看到。
3、字符与数字混合输入:
现在来看看字符和数字会摩擦出怎样的火花吧~
1)先字符后数字型:
#include<stdio.h>int main(void)
{int s,d;char c;while (1){s = scanf_s("%c%d",&c,1,&d);//注意scanf_s在混合输入时要在c后面加个输入长度。printf("此时存入的字符和数字是:%c和%d\n", c,d);printf("scanf_s返回值是:%d\n",s);}return 0;
}
ps:不明白为什么要在c后面加个长度的说,c不是都是1个字节吗。。
可以看到,当输入12q时,1被存入c,2被存入d,q 和\n在缓冲区,接下来,q被存入c,但是由于%d会跳过\n,因此程序要求客户再次输入,发现了qq,因为d已经有有效值2了,故不将q对应的溢出值存在d中,并把两个q扔到缓冲区,所以我们可以发现接下来q被打印了两次。
因此scanf接受信息的顺序其实是这样的:
12\qq\qw\w?
2)先数字后字符:
#include<stdio.h>int main(void)
{int s,d;char c;while (1){s = scanf_s("%d%c", &d,&c,1);//注意scanf_s在混合输入时要在c后面加个输入长度。printf("此时存入的数字和字符是:%d和%c\n", d, c);printf("scanf_s返回值是:%d\n", s);}return 0;
}
情形1:
第二个q无效,被扔到缓冲区,但是scanf的返回值为2;接下来,q不断被%d读取错误,原先的d和c的值都不被改变。
情形2:
只要前面是数字,就会被视为数字而不是字符。
情形3:
1和换行符在第一次输入时被扔到缓冲区供第二次输入使用。
3、%f:
输入字符:跟%d一样,只不过溢出值有小数点而已。
返回值:输入整型数时返回值是1。
总结:
1、scanf只有往%d或%f里打字符时返回值才为0,往%c里打数字时数字会被视为字符,没有影响,多打多余的会被扔到缓冲区里,返回值还是不受影响。
2、往%d里打字符时,若已有值,则值不改变,否则变为溢出值。
3、若用scanf_s输入多个值,要在%c后面加个,1,。
4、%d会吃掉它前面的空白字符,但是不会吃掉它后面的空白字符。
二、getchar()
1、getchar()或char c=getchar()的返回值是对应的输入字符;
2、单打getchar()可以吃掉一个字符
百变Scanf()的千层套路相关推荐
- 合约跟单千层套路,散户还有活路吗?
行业竞争趋于白热化,交易所的护城河从产品技术逐渐拓展到精细服务,真正满足用户需求才能脱颖而出.跟单产品的出现,切中了目前合约领域的需求. 文 | 秦晓峰 运营 | 盖遥 编辑 | Mandy王梦蝶 ...
- 千层套路 - Vue 3.0 初始化源码探秘
关注若川视野, 回复"pdf" 领取资料,回复"1",可加群长期交流学习 刘崇桢,微医云服务团队前端工程师,左手抱娃.右手持家的非典型码农. 9 月初 Vue. ...
- sql server 2014 判断一个列某个字段是否相同_Select * from user的千层套路——一个sql是如何执行的...
Select * from user的千层套路 作为一个程序员,可以说是无时无刻不与sql语句进行打交道,可是你真的了解MySQl的基本框架吗?以及你所写的每一条SQL是如何运行的吗?就比如下面这条平 ...
- 千层套路“千层饼”,论面试中的套路与反套路
其实在职场中,面试是一个非常戏精的环节. 一方面,作为求职者的我们会下意识地把自己包装成一个面试官可能很感兴趣或者符合招聘条件的求职者.另一方面,其实面试官也会下意识地包装自己的公司.团队.合理的美化 ...
- 古装偶像剧的千层套路
最近难得上星了一档大制作(据说是)古装剧,听说本身还有大量的原著粉积累,本电视剧重度爱好者很是心动,"照这架势,这剧肯定火呀!" 先拿出官方片花看了看,毕竟大家都说片花是全剧精华的 ...
- [MRCTF2020]千层套路1
BUU题目复现~~ 开局一个压缩包,flag全靠懵~ 拿到压缩包第一件事直接看能不能直接解压缩(很明显,有密码,不行!) 下一步,使用010Editor查看内部结构,发现确实操作着很多的". ...
- 《预训练周刊》第40期: 量子预训练、千层BERT与GPT
No.40 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...
- DeepMind激起千层浪的这篇论文,并非无所不能
皇甫琦 葛冬冬 撰稿 金磊 整理自 凹非寺 量子位 报道 | 公众号 QbitAI 本文对DeepMind近期的神经网络求解MIP(混合整数规划)的论文进行了一些初步解读.事实上,相较于此领域近期的类 ...
- 自由自在休闲食品意式手工冰淇淋 百变不离健康
据说冰淇淋最早的发展史是在中国的唐朝末期,最初人们开始在夏天制冰.到了宋代,商人们开始在冷食里加上水果或果汁.发展到元代,有人甚至在冰中加上果浆和牛奶.到了13世纪的时候,马可.波罗将元代这种制造冰淇 ...
最新文章
- CountDownLatch的实现分析
- Windows实现appium+iOS自动化测试
- Storm/JStorm之TopologyBuilder源码阅读
- ubuntu software updater已意外关闭 解决办法
- IMP-00017: 由于 ORACLE 错误 6550解决办法
- 一步一坑学android之安装andriod studio(andriod studio3.0)
- 软件测试 第三次作业
- 现在该去外企吗?入职微软三个月的我告诉你!
- oracle数据库plsqldev导出表、表结构的方法
- 用java编写英寸到厘米的转换_java-将英寸转换为英尺和英寸
- MediaWiki配置
- 【Stream】java8新特性Stream流总结
- 演讲者模式投影到幕布也看到备注_在PPT中插入备注时,如何在放映时只让演讲者看到,而观众看不到...
- vue组件及生命周期
- Contacts管理系统通讯录
- 电机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 互联网直播点播平台EasyDSS登录页广告位图片上传接口报错问题分析
- 程序员初入职场月薪三千,网友:3000元?你是在丢码农的脸吗
- python 解析下载的二进制Excel文件内容
- 区块链数据的安全管理技术初探