鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 绝尘の初

用scanf陷入死循环了怎么破,求助~!!!

[复制链接]
发表于 2013-4-23 18:35:36 | 显示全部楼层
强烈支持楼主ing……
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 08:18:11 | 显示全部楼层

比如 你第一循环输入a  <cr>,那么a被赋值给hxr,<cr>呢是回车,也是个字符,就会留在缓冲区,
第二的循环,执行到scanf的时候,就会把缓冲区残留的<cr>赋值给hxr。显然这不是我们想要的。为了避免这种情况,你就要想法把这个<cr>吃掉。
最正经的办法是刷新缓冲区 用fflush(stdin)。
说实话我确实学的不全,比不上那个学的都一瓶子水都溢出来了的人,继续努力吧。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 09:11:30 | 显示全部楼层
wjb8love_9c7c9c 发表于 2013-4-24 08:18
比如 你第一循环输入a  ,那么a被赋值给hxr,呢是回车,也是个字符,就会留在缓冲区,
第二的循环,执行 ...

于是 你根本不懂 scanf " %c" 空格%c是什么意思~~~

" %c"这个格式控制字符串 会读取1个 非空白字符
a                       b
随便中间多少个空白字符[\t \n 空格] 他都不会处理

fflush(stdin) 不是最正经的做法
未定义行为 不同编译器上面行为不一样

你在比如中描述的情况我懂 好几年前就懂
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 11:27:02 | 显示全部楼层
我是师兄 发表于 2013-4-24 09:11
于是 你根本不懂 scanf " %c" 空格%c是什么意思~~~

" %c"这个格式控制字符串 会读取1个 非空白字符

哥们,你这种方法,我确实不太懂,我只是初学者而已,回答问题,只是为了提高自己。
看你回答好些提问,知道你学的比我好,但有些事别太较真啊。
我们就事论事,共同提高,水深水浅的什么,都是笑话。
你看小甲鱼对这些低端的问题,从来不会回答。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 11:30:27 | 显示全部楼层
谢谢两位
总之是解决了
但是不大明白原理希望解释一下
还有为什么缓冲区的残余数据会对循环造成影响呢?

抱歉,回复错了,你看的那个应该是回复这位朋友的。
我没自大到那种程度。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 11:46:14 | 显示全部楼层
wjb8love_9c7c9c 发表于 2013-4-23 10:58
笑死我了,你可以再不小心的输入几个吧,看是不是你我给的方法都能出错呢,
这个程序没有对输入做检查。
...

一开始 我提出一个比较好的解决办法 " %c"
你回复 一个略带残缺的方式 getchar

你对这个解决缓冲区残余问题的了解根本不全面

我就告诉你 " %c" 好在哪里
用getchar 读取缓冲区残余数据又有什么弊端

你自己不懂还自大的 说 笑死了XXX
我才开始带有攻击性

话说 懂不懂不是重点
为人谦虚点

你都没弄懂 " %c" 是什么效果 就开始嘲笑别人
太浮躁
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-24 12:02:14 | 显示全部楼层
。。。。
我用2种方法,运行了看看,发现只要是输入诸如adcdabcd这样数据,2种方法的程序,都得不到正确的答案,只是%c在应对只添加一个空格,还能得到正确答案,对于,正确的输入,都能得到正确的回应。我只是笑,对如这个小程序,有必要用非法数据去测试它的健壮性吗? 没有嘲笑你的方法不对什么的。
其实有人说这算个小bug。
不过,我还是有收获,至少知道了%c也能解决这个情况。至于浮躁,嘿嘿,就看别人怎么看了。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-24 17:32:15 | 显示全部楼层
本帖最后由 绝尘の初 于 2013-4-24 17:36 编辑
wjb8love_9c7c9c 发表于 2013-4-24 12:02
。。。。
我用2种方法,运行了看看,发现只要是输入诸如adcdabcd这样数据,2种方法的程序,都得不到正确的 ...

现在唯一没搞明白的就是
为什么用%s会导致 i 永远是1呢,并且输入2个以上字符的情况下会自动跳出循环
单步调试后发现是scanf将输入的第一个字符赋给了hxr, 而第二个字符以后的值赋给了 i
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-24 17:36:35 | 显示全部楼层
我是师兄 发表于 2013-4-24 11:46
一开始 我提出一个比较好的解决办法 " %c"
你回复 一个略带残缺的方式 getchar

现在唯一没搞明白的就是
为什么用%s会导致 i 永远是1呢,并且输入2个以上字符的情况下会自动跳出循环
单步调试后发现是scanf将输入的第一个字符赋给了hxr, 而第二个字符以后的值赋给了 i
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-2 19:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表