C和C++中缓冲区刷新的理解

    (转自:http://hi.baidu.com/eaglemengwei/item/627ee1f6af6bd8c243c36a73

 平常做程序的时候我们经常会遇到这样的情况,本来直接输入的是这样的数据,然

而在读取输出的时候却不是我们输入时的数据。这是为什么呢? 原因就是我们在输入

的时候留下了垃圾,而我们定义的某个变量接受的数据正是“垃圾”而不是我们想要

的数据。没事总结一下C、C++中清除垃圾的方法(花了我一上午的时间啊,不过感觉

很有必要):

C语言中缓冲区的刷新:(清除输入时的垃圾)

1.fflush(stdin)
    
   头文件: include<stdio.h>
   清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串

后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)。

  **st是标准的意思,in指的是输入 
  fflush(stdin)是C中的一个函数,用来刷新缓冲区,如果刷新成功返回的是 0,指

定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。

例: 
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    fflush(stdin);
    scanf("%c",&ch);
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}
输入: 23       输出:23
       a              a
如果不加 fflush(stdin); 则输出的是 23 32 ,因为没有fflush(stdin)时第二个ch

接受的是 回车而不是 a;


2.getchar();
   
  头文件: #include<stdio.h>

   它的作用是单个的读取缓冲区里的数据,只能单个的读取; 用户输入的数据先存

放在缓冲区里,然后当执行getchar()时读取缓冲区里的相对第一个字符。如果出错

返回 -1。 
   利用它只能单个读取字符的特性可以用它来清除部分输入时留下的垃圾。
例:
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    getchar();//如果没有getchar();则ch接受的数据将会是输入时留下的垃圾
              //空格或者是回车;在这里相当必要!!!
    scanf("%c",&ch);
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}


3. %*nc

   n的值是可以根据而要而改变的,表示的是 吸收的字符的个数。用法和 getchar()

相像,只不过它可以很方便的改变吸收的字符的个数。

例:
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    scanf("%*%c",&ch);// 如果没有 %*c 输出的ch是“垃圾”,加上后就正确了
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}


C++ 中刷新缓冲区的方法


1,ignore() 
 
   调用的形式: cin.ignore(n,ch); 其中 n 指的是忽略字符的个数,ch 代表的是

终止的字符。 默认的情况下以 EOF结束。。。

   利用它忽略字符的特性可以作为“清除输入垃圾”的方法,但要明确它并不是真正

的清除。。。
 
 例:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
      int i;
      char a; 
      cin>>i;
      cin.ignore(1);// 用它忽略的是输入I之后的空格或者是回车;同C中的      

             //getchar();
      cin>>a;
      cout<<"i="<<i<<' '
          <<"a="<<(int)a<<endl;
      system("pause");
      return 0;
      }


2.cin.sync()

   用来清除缓冲区中未读取的信息

  例:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
      int i;
      char a; 
      cin>>i;
      cin.ignore(1);
      cin>>a;
      cout<<"i="<<i<<' '
          <<"a="<<(int)a<<endl;
      system("pause");
      return 0;
      }
输入: jkifi 
       fsjofia
输出: a: j   b: f   不加这个函数第二个输出的是 b: k
利用这个函数可以避免在一些地方输入出错问题!

3.cin.clear()

 这个只知道是用来重置错误标志的,具体的用法和功能还不是很清楚,弄清楚了再说

吧!

参考: 百度百科   CSON

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值