清除緩存c語言
scanf("%*[^\n]");
^取反或者「非」,[^\n]就是除了回車什麼都可以被scanf讀到。*表示被讀到了但是不把讀到值或者字元賦值給任何變數。
%*[^\n]就是讀取來自鍵盤的出去回車外的任意字元,並不賦值給變數。
scanf("%*c");
就一個*,和上邊表示一樣就是讀到了不賦值給任何變數。
再看,scanf("%[^\n]%*c",str)讀入一行字元,賦值給str變數。如果c前面沒有*,那麼就需要str後面再寫一個char類型的ch。這就告訴*表示讀到了但是不賦值給任何變數。
那麼scanf("%*[^\n]%*c")這句話,應該能理解了,兩個格式控制符裡面都有*,就是都讀到了都不賦值變數。
讀到這里應該差不多理解了,就是題中的兩句scanf(相當於scanf("%*[^\n]%*c"))讀到了輸入的abc,但是沒有賦值給任何變數。然後到了gets(str4);讀到了def賦值給str4,然後printf("%s\n", str4);後必然顯示def。
清空緩存區用fflush(stdin);這句代碼。
鍵盤輸入的東西都是放在緩沖區的這款區域,有變數過來了就帶走,沒有變數就在那裡呆著等待一個變數來帶它走。但是這個時候緩沖區裡面偶爾會有一些垃圾的字元,而影響了正常的輸入,有的時候用getchar()帶走一個兩個的字元,但是如果還是不見效一句fflush(stdin);就可以了。
⑵ C語言如何清除scanf()緩存
fflush(stdin);
⑶ c語言清除緩沖區的數據
while(getchar()!='n'); -- 應當是 while(getchar()!='\n'); 這是不斷循環取字元,直到取到 Enter 鍵時結束循環。作用,清除上面一次輸入時殘留在輸入流中的字元。
改用 fflush(stdin); 更佳。
ret = scanf("%d,%d",&a,&b); ret 為成功讀得的數據個數。
清除的緩沖區中的殘留數據: if (ret != 2) fflush(stdin);
⑷ C語言中如何清空輸入輸出緩沖區
最簡單的是用fflush()函數。
此函數包含在stdio.h頭文件中,用來強制將緩沖區中的內容寫入文件。
函數原型:int fflush(FILE *stream) ;
函數功能:清除一個流,即清除文件緩沖區.
常用場合:
一、ff(stdin)刷新標准輸入緩沖區,把輸入緩沖區里的東西丟棄
fflush(stdout)刷新標准輸出緩沖區,把輸出緩沖區里的東西列印到標准輸出設備上。
二、scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結 束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。
鍵盤緩沖區就可能有殘余信息問題。
scanf()函數應該只是掃描stdin流,這個殘存信息是在stdin中
解決就要在scanf()函數之後加個fflush(stdin)
三、寫文件的時候 不會馬上進行物理磁碟的文件讀寫,而是先寫入緩存,當緩存中內容達到一定程度後再寫
FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);
⑸ C語言如何清除鍵盤輸入緩存區
如果是只是清空一行的話可以用
charc;
while((c=getchar())!=' '&&c!=EOF);
⑹ C語言清空緩存問題
定義char型和int型都是正確的。getchar函數返回的是int型而不是char型,但因為getchar只接收一個位元組,返回的高位全是0,所以賦給char型變數時並不出錯。
⑺ c語言清楚緩存的兩種方法fflush(stdin)和)scanf("%[^\n]%*c")。scanf("%[^\n]%*c")怎麼理解。還有跪求區
fflush()函數是標準的作法。
scanf("%*[^\n]%*c")是用掃描集將緩沖區中的字元全部讀取來實現清除緩沖區的動作。
%*〔^\n〕將逐個讀取緩沖區中的'\n'字元之前的其它字元,%後面的*表示將讀取的這些字元丟棄,前遇到'\n'字元時便停止讀取操作,此時,緩沖區中尚有一個'\n'字元遺留,所以後面的%*c將讀取並丟棄這個遺留的換行符,這里的星號和前面的星號作用相同。由於所有從鍵盤的輸入都是以回車結束的,而回車會產生一個'\n'字元,所以將'\n'連同它之前的字元全部讀取並丟棄之後,也就相當於清除了輸入緩沖區。
⑻ C語言中清除緩沖區很重要嗎
如果緩沖區是在棧里分配的話是不需要清除的,因為系統會幫你做這個工作,但是如果緩沖區是分配在堆里的話就要自己手動清除了,不然會發生內存泄露,就是雖然不使用,但佔用的資源仍然不能釋放,會影響系統性能。
清除緩沖區有三種方法:
方法一:
fflush(stdin);
fflush(stdin)在VC上可以使用,但是其他編譯器不能保證對fflush的實現。
方法二:
setbuf(stdin, NULL);
setbuf(stdin, NULL);是使stdin輸入流由默認緩沖區轉為無緩沖區。但緩沖區沒有了。
方法三:
char ch;while((ch = getchar()) != '\n' && ch != EOF);
這種方法是最好的方法,因為它使用的是C語言的基本語法,在什麼情況都是支持的。
⑼ Linux C語言如何清除輸入緩存
有的時候會遇到這樣的一個問題,程序如下
#include
int main(void)
{
int a;
char b;
scanf("%d".&a);
scanf("%c",&b);
printf("%d\n",a);
printf("%c\n",b);
}
如果在終端上輸入3
列印如下:
3
列印出一個3和一個空行,我們就輸入了一個3,本來還應該再輸入一個字元的,這是怎麼回事。
原因是當我們輸入3後又輸入了個回車,C語言取字元都是在字元輸入緩沖區中讀取的,我們輸入3後回車,C語言就把這個回車放在字元緩沖區中,所以第二個scanf讀取的是字元緩沖區中的內容。
如果要解決一個最簡單的方法就是把這個字元用getchar()讀出來拋掉,這個就可以讓我們第二次輸入字元了,但getchar()只能讀一個,如果字元緩沖區中的內容有多個,或者不知道多少個,這就不好辦了。
還有一種方法就是在scanf上做文章,C語言的scanf這個輸入函數是很奇怪的,如果我把第二個scanf改一下,改成scanf("
%c",&b);%c前面有個空格啊,這個空格是寫在前面的,也就是在我們要輸入之前,要讀空白字元並忽略掉,如果你不輸入一有效字元在終端不論按多少個回車空格tab等都是無效的,所以這樣的scanf可以幫我們輸入有效字元。
如果scanf寫成scanf(" %c
",&b);,前後都有一個空格,前加空格已經說過了,那後面加空格會出現什麼情,注意,如果在後加個空格,當我們輸入一個有效字元回車,發現還沒有輸完,還要繼續輸入,這怎麼回是。在後面加空格是把我們輸入有效字元後面的空白字元忽略了,此時我們必須要輸一個有效字元才能終止輸入。
再來說一下整型,如果把第一個scanf改成
int c ;
scanf("%d,%d",&a,&c);
輸入兩個整型的變數,且%d與%d這間有個,號。這種情況下,你在輸入第一個數字後必須原樣輸出一個,號,後面的輸入才有效,如果在輸入的時候不加,號,在你輸入第一個整型數據後,忽略其它所有字元和數字除了,號,加,號後,與緊跟,號後的數據被讀入到變數c中,大家可以試,當前,號可以是其它任可字元,%d前後都可以加其它字元,都要原樣輸出才行。
另外,還可通過加__fpurge(stdin)函數清空輸入緩沖區,此函數在頭文件中。