[转载]根据 ANSI C标准,和一些传统 C 的经验
1. C 语言的fflush 只是用作清除 output stream 之用。 对于使用 fflush 在 stdin 这个动作,是没有定义的行为
( ref: ISO/IEC 9899-1999 7.19.5.2 , ANSI Sec. 4.9.5.2 )
2. 这个问题并不是 Turbo C 2.0 的 bug,这是标准 scanf 的正常行为。
Scanf 并不清理使用者输入的 newline character (0xa) ,在连续的 scanf 中如果参数字符串的第一个字是 % 参数 (for example: scanf(“%d”); ),它将会顺利地把 <last newline char><string> 读取,并且把 newline char 视作 white space,把它忽略。因此,在这个帖的代码 (修改前) 是可以正常运作。这是传统的 scanf 运用方法。
修改后的代码, scanf("i=%d j=%d",&i,&j); ,问题出现在参数字符串的开头是 ‘i=’ ,使 scanf 遇到最后一次 newline character 的时候便进行辨认,结果提前结束,返回错误。 这段程序的 i 和 j 不变,所以情形像 scanf 把上一次的数据读取一样,做成这个错误。
标准 scanf 本身的设计存在很多毛病,所以普遍建议是,不要采用 scanf,或是在 scanf 后作出完善的检查和处理。
3. 在这个情况,由于 fflush 不应该使用在 stdin 上,所以我们使用其它方法来解决,例如在 scanf 后面,加上一行 getchar(); ,把没有清理的 newline char 消除
printf("Please input num:");
scanf("i=%d j=%d",&i,&j);
getchar(); // clear newline