(轉自: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