fflush()函數(shù)是標準的作法。
創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元秀嶼做網(wǎng)站,已為上家服務(wù),為秀嶼各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
scanf("%*[^\n]%*c")是用掃描集將緩沖區(qū)中的字符全部讀取來實現(xiàn)清除緩沖區(qū)的動作。
%*〔^\n〕將逐個讀取緩沖區(qū)中的'\n'字符之前的其它字符,%后面的*表示將讀取的這些字符丟棄,前遇到'\n'字符時便停止讀取操作,此時,緩沖區(qū)中尚有一個'\n'字符遺留,所以后面的%*c將讀取并丟棄這個遺留的換行符,這里的星號和前面的星號作用相同。由于所有從鍵盤的輸入都是以回車結(jié)束的,而回車會產(chǎn)生一個'\n'字符,所以將'\n'連同它之前的字符全部讀取并丟棄之后,也就相當(dāng)于清除了輸入緩沖區(qū)。
最簡單的是用fflush()函數(shù)。
此函數(shù)包含在stdio.h頭文件中,用來強制將緩沖區(qū)中的內(nèi)容寫入文件。
函數(shù)原型:int fflush(FILE *stream) ;
函數(shù)功能:清除一個流,即清除文件緩沖區(qū).
常用場合:
一、ff(stdin)刷新標準輸入緩沖區(qū),把輸入緩沖區(qū)里的東西丟棄
fflush(stdout)刷新標準輸出緩沖區(qū),把輸出緩沖區(qū)里的東西打印到標準輸出設(shè)備上。
二、scanf()函數(shù)接收輸入數(shù)據(jù)時,遇以下情況結(jié)束一個數(shù)據(jù)的輸入:(不是結(jié)束該scanf函數(shù),scanf函數(shù)僅在每一個數(shù)據(jù)域均有數(shù)據(jù),并按回車后結(jié) 束)。
① 遇空格、“回車”、“跳格”鍵。
② 遇寬度結(jié)束。
③ 遇非法輸入。
鍵盤緩沖區(qū)就可能有殘余信息問題。
scanf()函數(shù)應(yīng)該只是掃描stdin流,這個殘存信息是在stdin中
解決就要在scanf()函數(shù)之后加個fflush(stdin)
三、寫文件的時候 不會馬上進行物理磁盤的文件讀寫,而是先寫入緩存,當(dāng)緩存中內(nèi)容達到一定程度后再寫
FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);
scanf("%*[^\n]");
^取反或者“非”,[^\n]就是除了回車什么都可以被scanf讀到。*表示被讀到了但是不把讀到值或者字符賦值給任何變量。
%*[^\n]就是讀取來自鍵盤的出去回車外的任意字符,并不賦值給變量。
scanf("%*c");
就一個*,和上邊表示一樣就是讀到了不賦值給任何變量。
再看,scanf("%[^\n]%*c",str)讀入一行字符,賦值給str變量。如果c前面沒有*,那么就需要str后面再寫一個char類型的ch。這就告訴你*表示讀到了但是不賦值給任何變量。
那么scanf("%*[^\n]%*c")這句話,應(yīng)該能理解吧,兩個格式控制符里面都有*,就是都讀到了都不賦值變量。
讀到這里你應(yīng)該差不多理解了,就是你的題中的兩句scanf(相當(dāng)于scanf("%*[^\n]%*c"))讀到了你輸入的abc,但是沒有賦值給任何變量。然后到了gets(str4);讀到了def賦值給str4,然后printf("%s\n", str4);后必然顯示def。
清空緩存區(qū)用fflush(stdin);這句代碼。
鍵盤輸入的東西都是放在緩沖區(qū)的這款區(qū)域,有變量過來了就帶走,沒有變量就在那里呆著等待一個變量來帶它走。但是這個時候緩沖區(qū)里面偶爾會有一些垃圾的字符,而影響了正常的輸入,有的時候用getchar()帶走一個兩個的字符,但是如果還是不見效一句fflush(stdin);就可以了。
fclose(fp);當(dāng)然不行,它不是清除文件而是關(guān)閉文件。fp=fopen("a.txt","w");肯定清除當(dāng)前目錄下名為a.txt文件的內(nèi)容,只留下一個文件名——你說沒有清除那只是路徑?jīng)]有寫全——我的工作代碼就這樣用著:每月1號0點自動清除上月記錄,開始本月新記錄。如果你說的是連文件名都清除的函數(shù),那叫刪除文件,有個函數(shù)叫remove(FILE *);,你可以一試。