1. 程式人生 > >No.17 清除scanf()函式的緩衝區

No.17 清除scanf()函式的緩衝區

scanf()是C語言中一個重要的輸入函式。但是在使用不當時會給程式帶來很大的漏洞。在這裡,我想就scanf()的緩衝區問題做一簡單的論述。

首先,先看以下程式碼:

#include <stdio.h>

int main()
{
	int count = 0 ;
	char ch = 0 ;
	while(count < 3)
	{
		printf("請輸入:") ;
		scanf("%c", &ch) ;
		count++ ;
	}
	return 0 ;
}

執行結果:
在這裡插入圖片描述

這個執行結果與我的初衷不同。本想通過這個while迴圈來控制輸入三次後結束。可是第二次游標並沒有停留,直接跳到了第“三”次輸入,這是因為scanf()函式有個緩衝區。在第一次輸入A後,還有個回車符 在scanf()函式的緩衝區裡,迴圈到第二次時,直接把這個“回車符”送給了scanf(),所以使用者並的輸入直接跳到了第三步。或者是一次性輸入3個字元甚至更多,程式就會直接執行完畢。道理同上。請看以下執行結果:
在這裡插入圖片描述


解決這個問題的方法就是要在每次輸入後清除掉緩衝區裡的剩餘內容。請看以下程式碼:

#include <stdio.h>

int main()
{
	int count = 0 ;
	char ch = 0 ;
	while(count < 3)
	{
		printf("請輸入:") ;
		scanf("%c", &ch) ;
		while ((ch = getchar()) != EOF && ch != '\n') ; //清除緩衝區的內容
		count++ ;
	}
	return 0 ;
}

執行結果:
在這裡插入圖片描述

這樣就可以正常地進行輸入了。