作者mifan (人.魔.姊.浴)
看板b96902HW
标题Re: [钢弹] 单班计程2-1
时间Tue Oct 16 10:51:25 2007
※ 引述《ohlar (欧拉)》之铭言:
: 请问一下
: 为什麽我用while( (scanf("%c%d%d",&x,&i,&h))!= EOF ){ 写
: 要按三次^Z才可以把程式终止呢?
: 有别的办法可以按一次就让他停下来吗?
: 搞了很久还是没分数@@
你所输入的东西(包含最後按下的换行符号)都会先丢到一块记忆体缓冲区当中
而 scanf 会接着从这块缓冲区依照你所给他的格式读出来
不过依照 scanf 的定义,他是有可能没有读满你所给他的变数数量就 return
你所用的 format string 就会造成这样的问题
至於为什麽会发生这样的问题呢?
假设我输入了 "A 2 3[换行符号]"
第一次 scanf 会把 A 2 3 分别丢给 x i h
可是这时候缓冲区当中还有个 [换行符号]
第二次进入 scanf 的时候他就会先读进 [换行符号] 给 x,
而 i h 会被忽略
这不算是 bug 而是 scanf 本身就是这样运作
format string 第一个要求读入的是字元
scanf 认为 [换行符号] 符合这样的要求所以就读进来了
如果你看 manual 的话,scanf 会 return 读入的变数个数
只有在缓冲区 eof 的状况下才会回传 EOF
解决办法有很多
其中一个是你的 format string 写成 "%d%d%d"
--
Tachikoma*3:「One、Two、Three,(兴奋)少佐好丰满啊
(比划)Bust and Hip,Bust and Hip,Bust and Hip。」
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.91.4
※ 编辑: mifan 来自: 140.112.91.4 (10/16 10:52)
1F:推 LPH66:唔..我说的bug和这个无关...那是两次^Z的原因 10/16 12:09