最簡(jiǎn)單的是用fflush()函數(shù)。
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的營(yíng)口網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
此函數(shù)包含在stdio.h頭文件中,用來強(qiáng)制將緩沖區(qū)中的內(nèi)容寫入文件。
函數(shù)原型:int fflush(FILE *stream) ;
函數(shù)功能:清除一個(gè)流,即清除文件緩沖區(qū).
常用場(chǎng)合:
一、ff(stdin)刷新標(biāo)準(zhǔn)輸入緩沖區(qū),把輸入緩沖區(qū)里的東西丟棄
fflush(stdout)刷新標(biāo)準(zhǔn)輸出緩沖區(qū),把輸出緩沖區(qū)里的東西打印到標(biāo)準(zhǔn)輸出設(shè)備上。
二、scanf()函數(shù)接收輸入數(shù)據(jù)時(shí),遇以下情況結(jié)束一個(gè)數(shù)據(jù)的輸入:(不是結(jié)束該scanf函數(shù),scanf函數(shù)僅在每一個(gè)數(shù)據(jù)域均有數(shù)據(jù),并按回車后結(jié) 束)。
① 遇空格、“回車”、“跳格”鍵。
② 遇寬度結(jié)束。
③ 遇非法輸入。
鍵盤緩沖區(qū)就可能有殘余信息問題。
scanf()函數(shù)應(yīng)該只是掃描stdin流,這個(gè)殘存信息是在stdin中
解決就要在scanf()函數(shù)之后加個(gè)fflush(stdin)
三、寫文件的時(shí)候 不會(huì)馬上進(jìn)行物理磁盤的文件讀寫,而是先寫入緩存,當(dāng)緩存中內(nèi)容達(dá)到一定程度后再寫
FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);
while(getchar()!='n'); -- 應(yīng)當(dāng)是 while(getchar()!='\n'); 這是不斷循環(huán)取字符,直到取到 Enter 鍵時(shí)結(jié)束循環(huán)。作用,清除上面一次輸入時(shí)殘留在輸入流中的字符。
改用 fflush(stdin); 更佳。
ret = scanf("%d,%d",a,b); ret 為成功讀得的數(shù)據(jù)個(gè)數(shù)。
清除的緩沖區(qū)中的殘留數(shù)據(jù): if (ret != 2) fflush(stdin);
scanf("%*[^\n]");
^取反或者“非”,[^\n]就是除了回車什么都可以被scanf讀到。*表示被讀到了但是不把讀到值或者字符賦值給任何變量。
%*[^\n]就是讀取來自鍵盤的出去回車外的任意字符,并不賦值給變量。
scanf("%*c");
就一個(gè)*,和上邊表示一樣就是讀到了不賦值給任何變量。
再看,scanf("%[^\n]%*c",str)讀入一行字符,賦值給str變量。如果c前面沒有*,那么就需要str后面再寫一個(gè)char類型的ch。這就告訴你*表示讀到了但是不賦值給任何變量。
那么scanf("%*[^\n]%*c")這句話,應(yīng)該能理解吧,兩個(gè)格式控制符里面都有*,就是都讀到了都不賦值變量。
讀到這里你應(yīng)該差不多理解了,就是你的題中的兩句scanf(相當(dāng)于scanf("%*[^\n]%*c"))讀到了你輸入的abc,但是沒有賦值給任何變量。然后到了gets(str4);讀到了def賦值給str4,然后printf("%s\n", str4);后必然顯示def。
清空緩存區(qū)用fflush(stdin);這句代碼。
鍵盤輸入的東西都是放在緩沖區(qū)的這款區(qū)域,有變量過來了就帶走,沒有變量就在那里呆著等待一個(gè)變量來帶它走。但是這個(gè)時(shí)候緩沖區(qū)里面偶爾會(huì)有一些垃圾的字符,而影響了正常的輸入,有的時(shí)候用getchar()帶走一個(gè)兩個(gè)的字符,但是如果還是不見效一句fflush(stdin);就可以了。
fflush()函數(shù)是標(biāo)準(zhǔn)的作法。
scanf("%*[^\n]%*c")是用掃描集將緩沖區(qū)中的字符全部讀取來實(shí)現(xiàn)清除緩沖區(qū)的動(dòng)作。
%*〔^\n〕將逐個(gè)讀取緩沖區(qū)中的'\n'字符之前的其它字符,%后面的*表示將讀取的這些字符丟棄,前遇到'\n'字符時(shí)便停止讀取操作,此時(shí),緩沖區(qū)中尚有一個(gè)'\n'字符遺留,所以后面的%*c將讀取并丟棄這個(gè)遺留的換行符,這里的星號(hào)和前面的星號(hào)作用相同。由于所有從鍵盤的輸入都是以回車結(jié)束的,而回車會(huì)產(chǎn)生一個(gè)'\n'字符,所以將'\n'連同它之前的字符全部讀取并丟棄之后,也就相當(dāng)于清除了輸入緩沖區(qū)。
你的貌似不可以。我昨天剛好遇到的問題,這是我搜集的資料。
關(guān)于C語(yǔ)言的清除緩沖區(qū)
1:本短文介紹三種方式清除C語(yǔ)言編譯時(shí)printf的緩存:
第一種:setbuf(stdin,NULL);
頭文件:includestdio.h
第二種:_
_fpurge(stdin);(相當(dāng)于Unix下面的fflush()。)
頭文件:includestdio_ext.h
第三種:while((c=getchar())!='\n'!=EOF);
其中以第二種方式最為有效與普遍。
2:下面貼上百度對(duì)setbuf與網(wǎng)上其他對(duì)_
_fpurge的詳細(xì)解析:
setbuf:
函數(shù)名:
setbuf
功
能:
把緩沖區(qū)與流相聯(lián)
用
法:
void
setbuf(FILE
*steam,
char
*buf);
說明:setbuf函數(shù)具有打開和關(guān)閉緩沖機(jī)制。為了帶緩沖進(jìn)行I/O,參數(shù)buf必須指向一個(gè)長(zhǎng)度為BUFSIZ(定義
???
在stdio.h頭文件中)的緩沖區(qū)。通常在此之后該流就是全緩沖的,但是如果該流與一個(gè)終端設(shè)備相關(guān),那么某些系統(tǒng)也可以將其設(shè)置為行緩沖。為了關(guān)閉緩沖,可以將buf參數(shù)設(shè)置為NULL。
程序例:
#include
stdio.h
char
outbuf[50];
int
main(void)
{
setbuf(stdout,outbuf);
puts("This
is
a
test
of
buffered
output.");
puts("This
output
will
go
into
outbuf");
puts("and
won't
appear
until
the
buffer");
puts("fills
up
or
we
flush
the
stream.\n");
puts(outbuf);
fflush(stdout);
return
0;
}
如果緩沖區(qū)是在棧里分配的話是不需要清除的,因?yàn)橄到y(tǒng)會(huì)幫你做這個(gè)工作,但是如果緩沖區(qū)是分配在堆里的話就要自己手動(dòng)清除了,不然會(huì)發(fā)生內(nèi)存泄露,就是雖然不使用,但占用的資源仍然不能釋放,會(huì)影響系統(tǒng)性能。
清除緩沖區(qū)有三種方法:
方法一:
fflush(stdin);
fflush(stdin)在VC上可以使用,但是其他編譯器不能保證對(duì)fflush的實(shí)現(xiàn)。
方法二:
setbuf(stdin, NULL);
setbuf(stdin, NULL);是使stdin輸入流由默認(rèn)緩沖區(qū)轉(zhuǎn)為無(wú)緩沖區(qū)。但緩沖區(qū)沒有了。
方法三:
char ch;while((ch = getchar()) != '\n' ch != EOF);
這種方法是最好的方法,因?yàn)樗褂玫氖荂語(yǔ)言的基本語(yǔ)法,在什么情況都是支持的。