HDU刷题总结(C语言版)

前言

最近笔者为了回顾c语言知识,开始刷HDUoj平台的题,发现了几个有趣的知识点,想和各位分享一下并对这些内容做个总结;当然这些知识可能对于大佬来说是非常简单的,但笔者以前并没有注意到这些知识,现在想对这些知识进行总结;好了闲言勿谈,接下来进入正式内容。

第一个知识点(~scanf(“%d”, &n))

问题来源
借鉴的博客
先截下图看看问题描述在这里插入图片描述
我们可以看到这是一道简单的10进制转成2进制的问题;这道题有趣的地方是哪里呢?我认为他有趣的地方是在循环控制的地方;题目并没有告诉我们它有几组数据,所以我们需要用循环来控制输入,按照我们常规的思维是定义一个变量来控制循环的输入,但我们可以看到题目并没有要求出现控制循环结束的变量;那怎么办呢?笔者查了一下,有很多人用了这种写法
~scanf(“%d”, &n)这个写法什么意思呢?我们来分析一下

1.首先我们先简单了解一下scanf;scanf返回的是你输入变量的个数,举个例子:scanf(“%d%d”, &a, &b);如果能成功被读入,那么scanf返回值就是2如果只有a或b被读入那就返回1,都没有读入就返回0;(这里我就不认证了,感兴趣的看官可以自己认真一下)
2.~scanf(“%d”, &n)==scanf(“%d”, &n)!=EOF
~是按位取反,如果scanf函数没有输入值或输入错误就是返回-1,-1按位取反结果是0不懂进制转化可以看一下这篇博客
EOF是End Of File,表示在文件结尾结束(这里可以参考c语言文件那一章的知识),我们知道EOF返回值是-1,循环停止的条件是0,刚好-1的二进制数取反后就是0所以循环就可以停止了,所~scanf(“%d”,&n)==scanf(“%d”, &n)!=EOF这个代码就相当于你可以输入任意组数据,当你不需要输入数据可以先按<ctrl+z>再按Enter键让机器识别到输入到文件结尾了,然后返回-1再取反,就可以让循环停止了。

第二个知识点(如何解决输入时,机器自动识别进\n和回车符的问题)

问题来源
老规矩先看看问题要求在这里插入图片描述
这道题和上面那一道题有异曲同工之妙,也是不知道有多少组数据,那么我们也是按上面做法输入,但那样输入你就会发现会出现数据流失的请情况,while (scanf("%c %c %c", &i, &j, &k)!=EOF)
在这里插入图片描述
第一组数据没出现任何问题,但第二组数据却丢失了一个,这是为啥呢?仔细观察一下我们再输入d时是不是按了回车键,键盘的回车键在编译器其实是做了两个动作(先换行再回车);是不是很惊讶,为什么叫换行会做两个动作,因为这是人家编译器创造大牛觉得回车还得输入\r转义字符比较麻烦,就规定输入\n和按下回车键就自动帮你做完换行和回车两个动作。
1.这里代码是解决字符ASCII码排序的问题,再回头看所以我们可以知道因为我们输入最后一个字符时,按下的回车键,然而回车键的ASCII值小于字符a的ASCII值所以自动把回车键排在最前面了,所以显示出来就是空格。
字符a的ASCII
在这里插入图片描述
回车键ASCII
在这里插入图片描述
可能有人说可以用fflush(stdin)来刷新缓存区,因为我们输入的先载入缓存区的嘛,但你查一查资料就可以发现,fflush并不是C和C++的标准,C和C++的标准里从来没有定义过 fflush(stdin)。但也有人说我用fflush也解决了问题,这个只是在个别编译器能解决问题(linux 下的 gcc 就不支持);好了说了这么多,那我们应该怎么解决这个问题呢?

也很简单,只需要加入这个代码while ((k = getchar()) != ‘\n’ && k != EOF)
这个代码可以不用考虑\n和回车直接运行可清除输入缓存流。那我们来验证一下吧!
这是我解决这道题目的代码
在这里插入图片描述
输出
在这里插入图片描述
所以问题解决了!

总结

这连个知识点就是笔者今天笔者分享的,如果各位大佬有什么好的解决方法,请私信交流或评论区交流;好了今天就到这了,笔者会不定时更新一些有趣的c语言的知识点。

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

平平无奇。。。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值