fflush()函數(shù)是標(biāo)準(zhǔn)的作法。
創(chuàng)新互聯(lián)從2013年創(chuàng)立,公司以成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶成百上千家,涉及國內(nèi)多個省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計、獨(dú)特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。
scanf("%*[^\n]%*c")是用掃描集將緩沖區(qū)中的字符全部讀取來實現(xiàn)清除緩沖區(qū)的動作。
%*〔^\n〕將逐個讀取緩沖區(qū)中的'\n'字符之前的其它字符,%后面的*表示將讀取的這些字符丟棄,前遇到'\n'字符時便停止讀取操作,此時,緩沖區(qū)中尚有一個'\n'字符遺留,所以后面的%*c將讀取并丟棄這個遺留的換行符,這里的星號和前面的星號作用相同。由于所有從鍵盤的輸入都是以回車結(jié)束的,而回車會產(chǎn)生一個'\n'字符,所以將'\n'連同它之前的字符全部讀取并丟棄之后,也就相當(dāng)于清除了輸入緩沖區(qū)。
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);就可以了。
flushall
添加義項?
函數(shù)名:?flushall
功?能:?清除所有緩沖區(qū)
用?法:?int?flushall(void);
程序例:
#include?stdio.h
int?main(void)
{
FILE?*stream;
/*?create?a?file?*/
stream?=?fopen("DUMMY.FIL",?"w");
/*?flush?all?open?streams?*/
printf("%d?streams?were?flushed.\n",
flushall());
/*?close?the?file?*/
fclose(stream);
return?0;
}
是I/O 函數(shù)分為“帶緩沖”的和“不帶緩沖”的兩類。
帶緩沖的 I/O 函數(shù)寫數(shù)據(jù)時,并不直接寫磁盤介質(zhì),而是將數(shù)據(jù)先寫到這塊內(nèi)存緩沖中,之后用戶空間緩沖中的數(shù)據(jù)會被傳送到系統(tǒng)緩沖中。
linux 內(nèi)核會將系統(tǒng)緩沖中的數(shù)據(jù)送完磁盤驅(qū)動器(fsync函數(shù)可以加速這一過程),這之后,數(shù)據(jù)才真正的被寫入磁盤。
因為目前內(nèi)存的讀寫速度往往遠(yuǎn)大于硬盤的讀寫速度(常 ms 級)。因此,緩沖區(qū)的建立可以盡力避免太過頻繁的寫磁盤。
對于硬盤來說,寫入一個字節(jié)可能跟寫入一個扇區(qū)沒什么兩樣,程序員每次寫入的數(shù)據(jù)也許就幾個字節(jié),所以可以將每次寫入的幾個字節(jié)放入緩沖區(qū),排列組合成一整塊數(shù)據(jù)再寫入,也能極大的提升效率。
擴(kuò)展資料
1、帶緩沖的 I/O 讀函數(shù)讀取數(shù)據(jù)之前,則會首先判斷用戶空間的進(jìn)程緩沖區(qū)是否包含數(shù)據(jù),如果沒有,則繼續(xù)判斷系統(tǒng)緩沖區(qū)是否包含數(shù)據(jù)。
2、“帶緩沖”的 I/O 讀函數(shù)從磁盤讀取數(shù)據(jù)時,并不只讀取調(diào)用者指定的讀取字節(jié)數(shù)。讀函數(shù)可能一次性讀取一個扇區(qū)(常常是 512B)保存在緩沖區(qū)里,只返回給程序員需要的 10 字節(jié)。
本文題目:c語言中清除緩存的函數(shù),c語言中清除緩存的函數(shù)是什么
標(biāo)題URL:http://chinadenli.net/article46/dseoshg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管、域名注冊、虛擬主機(jī)、App設(shè)計、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)