其实,这个问题要解释也不是不可以的:你scanf("%d ", &i),后面带个空格,那么scanf()程序就期待你输入一个数字之后也带一个空格,但你实际输入的动作与它的预期不符,一定是输完数字之后直接敲了回车,于是scanf()仍然在等待那个空格,直至你输入一个不是空格但又确实有东西灌进去时,才迫不得已结束等待,从而才进入下一行继续执行。但第二次的输入动作,不知道将给后面的程序带来什么影响,那是无法预知的,所以,才有清空键盘缓冲区的教导,根本原因就在这里。
我说过,scanf()其实就是一个小型的解释程序,它的行为不是常规C语言应有的。如果你用过BASIC之类,就知道语言的执行是在运行时才知道指令的,如果你实际的操作与期待不符,就会中断程序让你重新再来。scanf()、printf()之类,就是这种东西,它写好的代码,是无法应对活生生的人所可能采取的一切行动的,因此使用这种函数作人机交互处理,出错几乎是百分百的事情。你自己翻查论坛的问题,就可以看得到60%以上的初级问题都是scanf()引起的。你见我写过的程序代码用这个函数接收键盘输入吗?没有,因为我太清楚它这种机制将会在怎样时出错了,那种可能性太多,根本不能用于实际环境。scanf()类函数,唯一可用的地方是对文件或内存读入,而且这些数据是按照严格约定格式写好的,没有人的随机行为,才可能成功,那个时候,它很好用。
[
本帖最后由 TonyDeng 于 2011-10-23 00:30 编辑 ]