1. 程式人生 > >補.從零開始學習C語言--scanf的%c前為什麼加空格

補.從零開始學習C語言--scanf的%c前為什麼加空格

#include <stdio.h>
int main (void) 
{
	int i ;
	char ch ;
	
	scanf("%d",&i) ;
	scanf(" %c",&ch) ;	//這行的%C前有個空格
	printf("i = %d\nch = %c\n", i, ch) ; 
	
	/* 	輸入100 y 後的輸出結果:
		i = 100
		ch = y */
	
	return 0 ;
}

       有些朋友或許會有疑問,為什麼 scanf(" %c",&ch) 中的%c 前面要加一個空格,空格的作用到底是什麼…在這裡可以告訴大家,%c前面的空格就是用來遮蔽空白符的,但想要弄明白這個問題,必須要知道C語言 scanf

() 函式的特性,以及scanf()與緩衝區、標準輸入流之間的聯絡。 但在此之前,我們先介紹兩個專業術語。

1、緩衝區

   緩衝區是一塊存放臨時輸入資料的記憶體,我們在鍵盤上輸入資料之所以不會馬上顯示,就是因為資料存放在了緩衝區,在上面例子中,當我們按下回車鍵後,緩衝區的資料會傳送到標準輸入流。

2、標準輸入流

   標準輸入流(stdin)是檔案指標,scanf()就是從標準輸入流或許資料。 在以後的文章中,會接觸到fscanf函式的介紹中詳細解釋。

   以上面程式碼為例,當執行到scanf()時,開始等待使用者輸入,當我們輸入資料,在按下回車鍵前會把資料儲存在緩衝區,按下回車鍵後,會把資料以及換行符(\n)一起傳送到標準輸入流(stdin)中,scanf()就是從標準輸入流中或許資料,上面第一個scanf()要讀入一個整數,它從標準輸入流中查詢,跳過空白符(空格、換行符、製表符

,如果遇到數字,則開始讀入,直到遇到非數字的字元結束,最後計算讀取到的數值,儲存到相關變數中。

   如果能理解上面一段話,那麼你應該知道%c前空格的作用了,如果不能,請看看%c前不加空格程式的輸出結果。

#include <stdio.h>

int main (void) 
{
	int i ;
	char ch ;
	
	scanf("%d",&i) ;
	scanf("%c",&ch) ;
	printf("i = %d\nch = %c\n", i, ch) ; 
	
	/* 	輸入100 :
		i = 100
		ch = */
	
	return 0 ;
}

   請看上面的程式,我們輸入100後,咦,怎麼程式中止了,馬上輸入結果了? 但真的是終止了嗎?別忘了,標準輸入流中除了100外,還有一個換行符'\n'。 第一次scanf()讀取了100後,把'\n'留在了標準輸入流,第二個scanf()就從輸入流中獲取換行符了,由於scanf()函式的特性,空白符直接忽略,因此程式便結束了,第二個scanf()函式看似失效,實際上是執行完畢了。

 所以對於scanf()而言,%c是個較為特殊的說明符。 %c前沒空格,scanf()將讀取標準輸入流中的第一個字元,%c前有空格,scanf()則讀取標準輸入流中第一個非空白字元。讀到這,大家應該理解了吧?