Chinaunix首页 | 论坛 | 博客
  • 博客访问: 601462
  • 博文数量: 68
  • 博客积分: 2621
  • 博客等级: 少校
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 21:04
文章分类

全部博文(68)

文章存档

2013年(8)

2012年(52)

2010年(8)

分类: C/C++

2012-08-09 09:19:06

 在学习C++的用法时,有这样一个简单的问题,却让我对cin.clear()重新认识了。
  题目:
         读取一系列int型数据,将其存入vector对象中,然后使用count()统计某个指定值出现的次数。
  下面是我的程序:

点击(此处)折叠或打开

  1. int
  2. main(void)
  3. {
  4.     int num;
  5.     vector< int >ivec;
  6.           
  7.     while( cin >> num )
  8.          ivec.push_back(num);

  9.     cout << "Please input the number you want to count:"
  10.     cin >> num;

  11.     cout << num << " appears " << count(ivec.begin(), ivec.end(), num) << " times!" << endl;

  12.     return 0;
  13. }
运行结果:
  
   我输入了数据1、2、3,没有输入要查询的数据,然后按下" ctrl + D "就显示出如上的结果。程序将输入数据默认为3--最后一个数据(若输入其他的数据或者更多的数据,都显示最后一个结果),说明系统的输入流中已经有数据存在了,所以,在我们输入数据后,应该把输入流进行clear()。
  修改后的代码:

点击(此处)折叠或打开

  1. ...
  2. while( cin >> num )
  3.     ivec.push_back(num);

  4. cin.clear();

  5. cout << "Please input the number you want to cout:";
  6. cin >> num;
运行结果:

  
  细心的人,可能发现了修改后的运行结果与修改前的结果所占用的行数是不同的,修改前占用了4行,修改后的结果占用了5行。这就说明了问题,修改前的代码运行时,我并没有输入要查询的数据,所以没有按下回车键换行;而修改后的代码输入了要查询的数据,所以进行了换行。

注意:
       如果我们将要查询的数据分配一个新的变量,结果还是一样的。为什么呢?其实,只要输入流中的内容没有改变,任何变量中存放的都是输入流中的内容。
 
   这看似是一个很小的问题,但是如果我们不注意这样细小的问题,很有可能造成程序运行时错误。我自己是从这个很小的问题中,学习到了很多,希望你也是。
           
阅读(11875) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

xueruif2016-02-15 20:58:07

用fflush()函数也可以清除输入缓存
fflush(stdin);
原型:int fflush(FILE *stream)
如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
注意:如果fflush返回EOF,数据可能由于写错误已经丢失。当设置一个重要错误处理器时,最安全的是用setvbuf函数关闭缓冲或者使用低级I/0例程,如open、close和write来代替流I/O函数。

wanglc_work2015-04-16 11:20:34

这个关键问题不是缓冲区,而是流的状态。
ctrl+D,会导致流变成错误状态,导致循环结束后无法输入要查询的数字。
clear是用来重置cin状态的。

2012-10-03 00:05:24

今天刚看了c++primer ,看到close()和clear(),正好温习下,哈

ora-009002012-08-09 17:06:13