平常做程式的時候我們經常會遇到這樣的情況,本來直接輸入的是這樣的資料,然
而在讀取輸出的時候卻不是我們輸入時的資料。這是為什麼呢? 原因就是我們在輸入
的時候留下了垃圾,而我們定義的某個變數接受的資料正是“垃圾”而不是我們想要
的資料。沒事總結一下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()
這個只知道是用來重設錯誤標誌的,具體的用法和功能還不是很清楚,弄清楚了再說
吧!