有的時候會遇到這樣的一個問題,程序如下
#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)函數清空輸入緩沖區,此函數在頭文件中。
B. C語言如何清除鍵盤輸入緩存區
如果是只是清空一行的話可以用
charc;
while((c=getchar())!=' '&&c!=EOF);
C. c語言清楚緩存的兩種方法fflush(stdin)和)scanf("%[^\n]%*c")。scanf("%[^\n]%*c")怎麼理解。還有跪求區
fflush()函數是標準的作法。
scanf("%*[^\n]%*c")是用掃描集將緩沖區中的字元全部讀取來實現清除緩沖區的動作。
%*〔^\n〕將逐個讀取緩沖區中的'\n'字元之前的其它字元,%後面的*表示將讀取的這些字元丟棄,前遇到'\n'字元時便停止讀取操作,此時,緩沖區中尚有一個'\n'字元遺留,所以後面的%*c將讀取並丟棄這個遺留的換行符,這里的星號和前面的星號作用相同。由於所有從鍵盤的輸入都是以回車結束的,而回車會產生一個'\n'字元,所以將'\n'連同它之前的字元全部讀取並丟棄之後,也就相當於清除了輸入緩沖區。
D. c語言。清除鍵盤緩存的作用是什麼
因為鍵盤緩沖區里的信息會影響下一次對標准輸入的讀取,所以一般用while和getchar清除緩存區里的值
E. 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);
F. C語言中清除內存緩沖區的函數是什麼
C語言中清除內存緩沖區的函數是fflush(
),清除輸入緩沖區用fflush(stdin);
其中stdin表示標准輸入。
該函數通常用在輸入類函數的前面,用以清除輸入緩沖區中的內容,避免接收到上次殘留的內容而出錯。
舉例如下:
1、不加fflush函數:
// 將輸入的5個字元存放到數組str中,並輸出
int i;
char ch, str[6]={'\0'};
for(i=0; i<5; i++)
{
scanf("%c", &ch);
str[i] = ch;
}
printf("%s\n", str);
// 程序只能輸入三個字元(每個字元間包含一個回車符),因為不加fflush函數時,將殘留在緩沖區中的回車符也當成了一個字元輸入到數組str中。
2、加fflush函數:
int i;
char ch, str[6]={'\0'};
for(i=0; i<5; i++)
{
fflush(stdin); // 清除留在緩沖區中的回車符,確保接收到的是用戶輸入的字元
scanf("%c", &ch);
str[i] = ch;
}
printf("%s\n", str);
// 程序能正常輸出
G. 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);就可以了。