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);就可以了。
B. 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);
// 程序能正常輸出
C. C語言的輸入緩沖怎麼回事,哪裡有詳細介紹啊
緩沖是標准C中的標准I/O里的機制,標准庫里的I/O語句為了提高讀寫的效率,在實際讀寫之前將數據保存到一段內存中,這段內存就叫緩沖,分全緩沖,行緩沖兩種,全緩沖在緩沖的內存滿了之後做實際的讀寫,行緩沖在遇到換行符之後做實際的讀寫,unix高級環境編程里第五章里有詳細的說明,或者網路也有
D. C語言中,求內存緩沖區的詳細解釋!
緩沖區(Buffer)又稱為緩存(Cache),是內存空間的一部分。也就是說,在內存中預留了一定的存儲空間,用來暫時保存輸入或輸出的數據,這部分預留的空間就叫做緩沖區。
緩沖區根據其對應的是輸入設備還是輸出設備,分為輸入緩沖區和輸出緩沖區。
E. C語言里如何設置緩沖區,
很簡單的定義一個數組,用兩個變數下標來指向頭和尾,新數據來尾++ 老數據處理完頭++ 兩個下標超過界限時從頭開始循環利用 中間要考慮緩存數據空和數據滿的情況
或者你動態分配空間,來一個信號分配空間,插入隊列鏈表,處理完一個出隊列,釋放空間
F. 在c語言中如果輸入數據太大,該怎麼避免
C語言的輸入輸出比較原始,要看是如何進行輸入的:
1,從控制台輸入
這里其實輸入的都是終端的位元組流,控制位元組流就可以達到控制輸入數據的目的
2,從其他輸入設備輸入
例如,從文件讀取,那麼就要在程序里讀取合適大小的數據段,避免出現溢出的現象。
G. c語言清除緩沖區的數據
while(getchar()!='n'); -- 應當是 while(getchar()!='\n'); 這是不斷循環取字元,直到取到 Enter 鍵時結束循環。作用,清除上面一次輸入時殘留在輸入流中的字元。
改用 fflush(stdin); 更佳。
ret = scanf("%d,%d",&a,&b); ret 為成功讀得的數據個數。
清除的緩沖區中的殘留數據: if (ret != 2) fflush(stdin);
H. 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);