专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » 学习的误区:学习C与C++ 误区二 »正文

学习的误区:学习C与C++ 误区二

来源: 发布时间:星期四, 2008年9月25日 浏览:33次 评论:0

1. 为什么 fflush(stdin) 是错的

首先请看以下程序:
#include<stdio.h>

int main( void )

{

int i;

for (;;) {

fputs(\"Please input an integer: \", stdout);

scanf(\"%d\", &i);

printf(\"%d\\n\", i);

}

return 0;

}

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf(\"%d\", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。

也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);,把输入缓冲清空掉不就行了?”然而这是错的!CC++标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)MSDN 文档里也清楚地写着 fflush _disibledevent=\"Times New Roman\">fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: