scanf()函數基礎擴充:
C函數庫包含了多個輸入函數,其中最常用的差不多就是scanf()了,它可以讀取各種格式的輸入。
scanf()可以把輸入的字符串轉換成我們想要的各種形式,整數、浮點數、字符串等等,它是printf()的逆過程。和printf()一樣都有控制字符串和參數列表,不同的是scanf()的參數列表是指向變量的指針。
#include <stdio.h> int main() { int age; float height; char address[30]; printf("enter your age\n"); scanf("%d",&age); printf("enter your height\n"); scanf("%f",&height); printf("enter your address\n"); scanf("%s",address); printf("age : %d height: %f address: %s\n",age,height,address); }
上述程序用scanf()完成了一個簡單的提示輸入交互功能。
int age; float height; char address[30]; scanf("%d",&age); scanf("%f",&height); scanf("%s",address);
可以看到第三個scanf的參數和第一二個的參數長得不太一樣,第一二個用了取地址符&,第三個沒有。然而它們都是指向相應變量的指針,對於指向int、float型的指針,用變量名取地址,也就是上面的&age 和 &height;對於數組,數組名便是指向它的指針,如上面的 address。
scanf()要求傳遞的是變量的指針,因為我們的輸入要存儲到這些變量中,也就是要在函數中改變這些變量的值,傳遞指針才能修改參數變量的值,這裡感覺有點像用一個函數交換兩個數的值參數要傳指針那樣的情況。如果傳遞的不是指向對應變量的指針,那麼程序很可能崩潰。
從scanf()的角度看輸入:
假定我們使用了一個%d說明符來讀取一個整數。
scanf()開始每次讀取一個輸入字符,且跳過空白字符(空格、tab、換行符)直到遇到第一個非空白字符,它試圖讀取一個整數,所以如果遇到輸入字符為一個數字或者一個符號(+和-)則把該字符保存並繼續下一個字符的讀取,直到它遇到一個非數字的字符,就可以得出結論已經讀到了整數的尾部,這時scanf()把這個非數字的字符放回輸入。這意味著當程序進行下一次開始讀取輸入時,它將從前面被放回輸入的那個非數字字符開始。
最後scanf()計算讀取到的輸入的相應數值,並將該值存放到相應變量中。
scanf()的返回值:
scanf()函數返回成功讀入的項目的個數,如果沒有讀取任何項目(當期望讀取到數字,而輸入的是飛數字字符)則返回0。當檢測到文件末尾時,會返回EOF(end of file),EOF是在文件
stdio.h中定義的特殊值,一般 #define為-1。
scanf()的返回值可以有如下程序等應用:
//輸入為數字則進行處理,否則退出循環 while(1==scanf("%d",&num)) { //do something... } //跳過輸入的整數 while(1==scanf("%d",&num)) ;
參考:C primer plus