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