補.從零開始學習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
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()則讀取標準輸入流中第一個非空白字元。讀到這,大家應該理解了吧?