scanf
scanf函數,與printf函數一樣,都被定義在stdio.h里,因此在使用scanf函數時要加上#include。它是格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中,其關鍵字最末一個字母f即為“格式”(format)之意。
函數原型
int scanf( const char *format, ... );
scanf()函數是格式化輸入函數,它從標準輸入設備(鍵盤) 讀取輸入的信息。
其調用格式為: scanf("<格式化字符串>",<地址表>);
函數 scanf() 是從標準輸入流 stdio 中讀內容的通用子程序,可以讀入全部固有類型的數據并自動轉換成機內形式。
返回值
scanf()函數返回成功賦值的數據項數,讀到文件末尾出錯時則返回EOF。
如:
scanf("%d,%d", &a, &b);
如果a和b都被成功讀入,那么scanf的返回值就是2
如果只有a被成功讀入,返回值為1
如果a和b都未被成功讀入,返回值為0
如果遇到錯誤或遇到end of file,返回值為EOF。
且返回值為int型.
例:使用scanf函數輸入數據。
#include<stdio.h>
int main()
{
int a,b,c;
printf("輸入 a, b, c
");
scanf("%d,%d,%d", &a, &b, &c);
printf("a = %d b = %d c = %d
", a, b, c);
fflush(stdin);
return 0;
}
注意上面的scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之間有逗號,在輸入數據時也要加逗號,如果去掉逗號,輸入時就不用逗號,而用空格,tab鍵或回車鍵將各個數據隔開
&a,&b,&c中的&是地址運算符,&a指a在內存中的地址。scanf的作用是:按照a,b,c的內存地址將a,b,c的值存進去。變量a,b,c的地址是在編譯連續階段分配的。
這里注意:如果scanf中%d是連著寫的如“%d%d%d”,在輸入數據是,數據之間不可以加逗號,只能是空格或tab鍵——“2 3 4”/“2(按tab)3(按tab)4(按tab)”。若是“%d,%d,%d”,則在輸入數據時需要加“,”——“2,3,4”.
注意問題
(1)對于字符串數組或字符串指針變量,由于數組名和指針變量名本身就是地址,因此使用scanf()函數時,不需要在它們前面加上"&"操作符。
(2)可以在格式化字符串中的"%"各格式化規定符之間加入一個整數,表示任何讀操作中的最大位數。
(3) scanf()函數中沒有精度控制。
如: scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。
(4) scanf中要求給出變量地址,如給出變量名則會出錯
如 scanf("%d",a);是非法的,應改為scanf("%d",&a);才是合法的。
(5)在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則可用空格,TAB或回車作間隔。
C編譯在碰到空格,TAB,回車或非法數據(如對“%d”輸入“12A”時,A即為非法數據)時即認為該數據結束。
(6)在輸入字符數據(%c)時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。
例如:scanf("%c%c%c",&a,&b,&c);
輸入為:
d e f
則把'd'賦予a, ' (空格)'賦予b,'e'賦予c。因為%c 只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔,因此把' '作為下一個字符送給b。
只有當輸入為:def 時,才能把'd'賦于a,'e'賦予b,'f'賦予c。
備注:使用 scanf()時,對于參數列表應遵循以下規則:
如果希望讀取基本數據類型變量的值,應在變量名的前面加上符號&;
當讀取指針變量指向的值時,在變量名前不能使用&。
總結
- 上一篇: PHPCMS V9添加模板自定义全局变量
- 下一篇: 硅谷热辩:AI是否会毁灭人类?