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!

推薦閱讀: