C語言中關於scanf讀取緩存區的問題
前言
在牛客做瞭很多坑爹的題,明明代碼沒問題但是就退無法AC,看瞭很多題解之後,發現是scanf讀取緩存區,在輸入輸出時出現瞭問題 於是寫個博客總結一下
首先我們要瞭解什麼是 scanf 函數
根據 cplusplus.com的解釋
scanf函數的定義
scanf()函數是通用 終端格式化輸入 函數,它從標準輸入設備(鍵盤)
讀取輸入的信息。可以讀入任何固有類型的數據並自動把數值變換成適當的機內格式。 其調用格式為:
scanf(“<格式化字符串>”,<地址表>);
功能:執行格式化輸入
並且註意:scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
當進一步深挖之後(暫時不需要知道原理,隻需要知道結果即可),
可以得到這樣一個認識:
鍵盤輸入的東西並沒有直接給scanf讀取 而是在緩沖區進行暫時存放
比如這樣一段代碼:
#include <stdio.h> int main() { int a, b, c, d, e; scanf("%d %d %d %d", &a, &b, &c, &d); printf("%d %d %d %d\n", a, b, c, d); scanf("%d", &e); printf("%d\n", e); return 0; }
預期:1 2 3 4
1 2 3 4
5
5
但是如果你這樣輸入: 1 2 3 4 5
會輸出 1 2 3 4
5
這是因為scanf以回車鍵為信號,去緩沖區進行讀取數據,隻要數據的格式符合標準,那麼就可以正確讀取,否則就要等待繼續輸入/讀取失敗
總結
通過查閱網站我們知道瞭,scanf函數是標準輸入流(從鍵盤接收數據),接收的數據放入輸入緩沖區中,其中就包括在鍵盤輸入的空格、回車這類字符,
但是!!!
當你用%d接收時是不會影響的,但是用%c就會產生錯誤,這是因為在”%c”輸入時,空格和轉義字符均被視為有效字符會被%c接收。從而導致輸出錯誤,無法AC
解決方法
1.List item
可以再%c前 鍵入一個空格 (優解)
eg:scanf(" %c",&a);
這裡 %c前面加上空格鍵 可以消除前面所有的空白字符(輸入的時候就會消化掉這個\n) 從而 不需要使用getchar()去吞\n
並且不會為下次留下空白字符的隱患
2.使用getchar()去吞掉緩存區中的\n
while(ch=getchar()!=EOF) getchar();
使用getchar(); 去吞掉緩存區中剩餘的 ‘\n’ ,從而使程序可以正常運行
到此這篇關於C語言中關於scanf讀取緩存區的問題的文章就介紹到這瞭,更多相關C語言scanf緩存區內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!