scanf()函式的功能是從計算機預設的輸入裝置(一般指鍵盤)向計算機主機輸入資料。
呼叫scanf()函式的一般格式如下:
scanf("格式字串",輸入項位址表);
例如:scanf("%d%f",&i,&f);
其中,「格式字串」可以包含三種型別的字元:格式指示符、空白字元(空格、跳格鍵、回車鍵)和非空白字元(又稱為普通字元)。格式指示符用來指定資料的輸入格式;空白字元作為相鄰兩個輸入資料的預設分隔符;非空白字元在輸入有效資料時必須按原樣一起輸入。
「輸入項位址表」由若干個輸入項位址組成,相鄰兩個輸入項位址之間用逗號分開。輸入項位址表中的位址可以是變數的位址,也可以是字元陣列名或指標變數(在後續章節中介紹)。變數位址的表示方法為「&變數名」,其中「&」是位址運算子。
在c++中,cin表示標準輸入流物件,用於從鍵盤獲取資料,「>>」是提取符,它將使用者從鍵盤輸入的資料賦給其後的變數,而且不像scanf()函式那樣需要指定格式指示符,即「cin >>」語句可以為任何型別的變數獲取資料,使用起來簡單方便。例如,與上述語句等同功能的cin語句如下:
cin >> i >> f;
不過,由於定義提取符等包含在標頭檔案iostream.h中,所以在使用「cin >>」語句時應包含「#include 」預處理命令。
格式指示符的一般形式如下:
%[修飾符]格式字元
scanf()函式常用格式字元如表3-3所示。
表3-3 scanf()函式常用格式字元
格式字元
說 明
c輸入單個字元
d,i輸入有符號的十進位制整數
o輸入無符號的八進位制整數
x,x輸入無符號的十六進製制整數
u輸入無符號的十進位制整數
f輸入實數,可以用小數形式或指數形式輸入
e,e,g,g
與f的作用相同,e與f、g可以互相替換
s輸入字串,將字串送到乙個字元陣列中,在輸入時以非空白字元開始,以第1個空白字元結束,字串以串結束標誌'\0'作為其最後乙個字元
1.寬度修飾
寬度修飾用來指定輸入資料所佔列數,例如:
scanf("%3c%3c",&ch1,&ch2);
假設輸入「abcdefg」,則系統將讀取的「abc」中的「a」賦給變數ch1,將讀取的「def」中的「d」賦給變數ch2。
2.抑制修飾符
scanf(%2d%*2d%3d",&n1,&n2);
假設輸入「123456789」,則系統將讀取「12」並賦值給n1;讀取「34」,但捨棄掉(「*」的作用);讀取「567」並賦值給n2。
【程式3-4】當輸入「11 22 33 44 55 66 77 88 99↙」時,以下程式的執行結果是什麼?
/*檔名:chap03_4.cpp*/
#include
void main()
int n1,n2,n3,n4,n5;
scanf("%d%*d%d%*d%d%*d%d%*d%d",&n1,&n2,&n3,&n4,&n5);
printf("s1=%d,s2=%d\n",n1+n3+n5,n2+n3+n4);
程式執行結果:
s1=165,s2=165
程式中雖然要求輸入9個整數,但對於所輸入的第2、4、6、8個整數抑制了賦值,n1、n2、n3、n4、n5得到的值分別是11、33、55、77、99;n1+n3+n5=165、n2+n3+n4=165。
3.長度修飾符
在輸入長整型資料和雙精度實型資料時,必須使用長度修飾符「l」,否則不能得到正確的輸入值。例如:
long x;double y;
scanf("%ld %lf",&x,&y);
呼叫scanf()函式輸入資料時,要注意以下幾點。
(1)如果相鄰兩個格式指示符之間不指定資料分隔符(如逗號、冒號等),則相應的兩個輸入資料之間至少用乙個空格分開,或者用tab鍵分開,或者輸入乙個資料後,按enter鍵,然後再輸入下乙個資料。例如:
scanf("%d%d",&n1,&n2);
假設給n1輸入10,給n2輸入20,則正確的輸入操作為:
10 20↙
或者:10↙
20↙(2)scanf()函式中沒有精度控制,如scanf("%5.2f",&x);是錯誤的。不能企圖用此語句輸入小數為2位的實數。
(3)格式字串**現的普通字元(包括轉義字元形式的字元)務必按原樣輸入。例如:
scanf("n1=%d,n2=%d",&n1,&n2);
假設給n1輸入10,給n2輸入20,正確的輸入操作為:
n1=10,n2=20↙
另外,對於scanf()函式中格式字串內的轉義字元(如'\n'),系統並不把它當轉義字元來解釋,從而產生乙個控制操作,而是將其視為普通字元,也要按原樣輸入。例如:
scanf("n1=%d,n2=%d\n",&n1,&n2);
假設給n1輸入10,給n2輸入20,正確的輸入操作為:
n1=10,n2=20\n↙
為了改善人機互動性,同時簡化輸入操作,在設計輸入操作時一般先用printf()函式輸出乙個提示資訊,再用scanf()函式進行資料輸入。例如:
printf("n1=");scanf("%d",&n1);
printf("n2=");scanf("%d",&n2);
(4)輸入資料時,若遇到以下情況系統則認為該資料輸入結束。
遇到空格或者回車鍵或者tab鍵。
遇到輸入域寬度結束。例如「%3d」,只取三列。
遇到非法輸入。例如,在輸入數值資料時,遇到字母等非數值符號(數值符號僅由數字字元0~9、小數點和正負號構成)。
(5)使用格式說明符「%c」輸入單個字元時,空格和回車鍵符號等均作為有效字元被輸入。例如:
scanf("%c%c%c",&ch1,&ch2,&ch3);
printf("ch1=%c,ch2=%c,ch3=%c\n");
假設輸入a b↙,則系統將字母「a」賦值給ch1,空格賦值給ch2,「b」賦值給ch3。
【程式3-5】有以下程式:
/*檔名:chap03_5.cpp*/
#include
void main()
int i;
float f;
char c;
scanf("%d%c%f",&i,&c,&f);
printf("i=%d,c=%c,f=%f\n",i,c,f);
當輸入100a1.234↙時,程式將100賦給整型變數i,'a'賦給字元型變數c,1.234賦給單精度型變數f,所以輸出結果是:
i=100,c=a,f=1.234000
當輸入1.23456↙時,程式將1賦給整型變數i,「.」賦給字元型變數c,23456賦給單精度型變數f,輸出結果是:
i=1,c=.,f=23456.000000
【程式3-6】編寫乙個程式,輸入弧度值,將弧度值換算成角度值(度、分、秒的形式)輸出。
設x為弧度,則對應的角度為(180*x)/π,其整數部分為度,餘下的小數部分乘以60取整數部分得到分,再將餘下的小數部分乘以60取整數部分得到秒。程式如下:
/*檔名:chap03_6.cpp*/
#include
#define pi 3.14159
void main()
float x,a,a1;
int d,f,m; /*d為度,f為分,m為秒*/
printf("輸入弧度:");
scanf("%f",&x);
a=x*(180.0/pi);
d=(int)a; /*取弧度*/
a1=(a-d)*60;
f=(int)a1; /*取分數*/
m=int((a1-f)*60+0.5); /*取秒數,0.5用於進行四捨五入計算*/
printf("%g <==> %d度%d分%d秒\n",x,d,f,m);
本程式的一次執行結果如下:
輸入弧度:2.4↙
2.4 <==> 137度30分36秒
scanf 格式化輸入
scanf 有種帶的格式化輸出方式 此格式控制符的基本格式為 scanfset includeint main 以下來自網路 scanfset 有兩種形式 一種是以非 字元開頭的 scanset 表示在讀入字串時將匹配所有在 scanfset 現的字元,遇到非scanfset 中的字元時輸入就結束 ...
scanf格式化輸入的研究
相關名詞 格式控制符 因為計算機中所有的資料都是二進位制 0 1 所以輸入輸出的時候要用格式控制符告訴計算機以什麼形式將二進位制資料顯示出來或儲存進去。1 兩個相鄰的格式控制符之間,不指定資料分隔符,則相應的兩個輸入資料之間,至少用乙個空格分隔,或者用tab分隔,或者在乙個資料後,按回車,然後再輸入...
scanf 函式的格式化輸入
函式原型 int scanf const char restrict format,跟printf 一樣,scanf 使用控制字串和引數列表。但和printf 的區別是,printf 函式使用變數名 變數和表示式 而scanf 函式使用指向變數的指標。scanf 函式所用的轉換說明字元與printf...