C語言格式輸入函數(shù)scanf()詳解

scanf函數(shù)稱為格式輸入函數(shù),即按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中叛薯。

scanf函數(shù)的一般形式

scanf函數(shù)是一個標準庫函數(shù)浑吟,它的函數(shù)原型在頭文件“stdio.h”中笙纤。與printf函數(shù)相同,C語言也允許在使用scanf函數(shù)之前不必包含stdio.h文件组力。scanf函數(shù)的一般形式為:

scanf(“格式控制字符串”, 地址表列);

其中省容,格式控制字符串的作用與printf函數(shù)相同,但不能顯示非格式字符串燎字,也就是不能顯示提示字符串腥椒。地址表列中給出各變量的地址。地址是由地址運算符“&”后跟變量名組成的候衍。

例如:&a笼蛛、&b分別表示變量a和變量b的地址。

這個地址就是編譯系統(tǒng)在內(nèi)存中給a蛉鹿、b變量分配的地址滨砍。在C語言中,使用了地址這個概念妖异,這是與其它語言不同的惋戏。 應該把變量的值和變量的地址這兩個不同的概念區(qū)別開來。變量的地址是C編譯系統(tǒng)分配的他膳,用戶不必關心具體的地址是多少日川。

變量的地址和變量值的關系

在賦值表達式中給變量賦值,如:

a=567;

則矩乐,a為變量名,567是變量的值回论,&a是變量a的地址散罕。

但在賦值號左邊是變量名,不能寫地址傀蓉,而scanf函數(shù)在本質上也是給變量賦值欧漱,但要求寫變量的地址,如&a葬燎。這兩者在形式上是不同的误甚。&是一個取地址運算符,&a是一個表達式谱净,其功能是求變量的地址窑邦。

【例4-7】

#include

intmain(void){

inta,b,c;

printf("input a,b,c\n");

scanf("%d%d%d",&a,&b,&c);

printf("a=%d,b=%d,c=%d",a,b,c);

return0;

}

在本例中,由于scanf函數(shù)本身不能顯示提示串壕探,故先用printf語句在屏幕上輸出提示冈钦,請用戶輸入a、b李请、c的值瞧筛。執(zhí)行scanf語句厉熟,等待用戶輸入。在scanf語句的格式串中由于沒有非格式字符在“%d%d%d”之間作輸入時的間隔较幌,因此在輸入時要用一個以上的空格或回車鍵作為每兩個輸入數(shù)之間的間隔揍瑟。如:

7 8 9

7

8

9

格式字符串

格式字符串的一般形式為:

%[*][輸入數(shù)據(jù)寬度][長度]類型

其中有方括號[]的項為任選項。各項的意義如下乍炉。

1) 類型

表示輸入數(shù)據(jù)的類型绢片,其格式符和意義如下表所示。

格式字符意義

d輸入十進制整數(shù)

o輸入八進制整數(shù)

x輸入十六進制整數(shù)

u輸入無符號十進制整數(shù)

f或e輸入實型數(shù)(用小數(shù)形式或指數(shù)形式)

c輸入單個字符

s輸入字符串

2) “*”符

用以表示該輸入項恩急,讀入后不賦予相應的變量杉畜,即跳過該輸入值。如:

scanf("%d %*d %d",&a,&b);

當輸入為:1?? 2?? 3時衷恭,把1賦予a此叠,2被跳過,3賦予b随珠。

3) 寬度

用十進制整數(shù)指定輸入的寬度(即字符數(shù))灭袁。例如:

scanf("%5d",&a);

輸入12345678只把12345賦予變量a,其余部分被截去窗看。又如:

scanf("%4d%4d",&a,&b);

輸入12345678將把1234賦予a茸歧,而把5678賦予b。

4) 長度

長度格式符為l和h显沈,l表示輸入長整型數(shù)據(jù)(如%ld)和雙精度浮點數(shù)(如%lf)软瞎。h表示輸入短整型數(shù)據(jù)。

使用scanf函數(shù)還必須注意以下幾點:

scanf函數(shù)中沒有精度控制拉讯,如:scanf("%5.2f",&a);是非法的涤浇。不能企圖用此語句輸入小數(shù)為2位的實數(shù)。

scanf中要求給出變量地址魔慷,如給出變量名則會出錯只锭。如 scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的院尔。

在輸入多個數(shù)值數(shù)據(jù)時蜻展,若格式控制串中沒有非格式字符作輸入數(shù)據(jù)之間的間隔則可用空格,TAB或回車作間隔邀摆。C編譯在碰到空格纵顾,TAB,回車或非法數(shù)據(jù)(如對“%d”輸入“12A”時隧熙,A即為非法數(shù)據(jù))時即認為該數(shù)據(jù)結束片挂。

在輸入字符數(shù)據(jù)時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符音念。

例如:

scanf("%c%c%c",&a,&b,&c);

輸入 d沪饺、e、f 則把'd'賦予a闷愤,' ' 賦予b整葡,'e'賦予c。只有當輸入為?def?時讥脐,才能把'd'賦于a遭居,'e'賦予b,'f'賦予c旬渠。

如果在格式控制中加入空格作為間隔俱萍,如:

scanf("%c %c %c",&a,&b,&c);

則輸入時各數(shù)據(jù)之間可加空格。

【例4-8】

#include

intmain(void){

chara,b;

printf("input character a,b\n");

scanf("%c%c",&a,&b);

printf("%c%c\n",a,b);

return0;

}

由于scanf函數(shù)"%c%c"中沒有空格告丢,輸入M? N枪蘑,結果輸出只有M。而輸入改為MN時則可輸出MN兩字符岖免。

【例4-9】

#include

intmain(void){

chara,b;

printf("input character a,b\n");

scanf("%c %c",&a,&b);

printf("\n%c%c\n",a,b);

return0;

}

本例表示scanf格式控制串"%c %c"之間有空格時岳颇,輸入的數(shù)據(jù)之間可以有空格間隔。

5) 如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符颅湘。

例如:

scanf("%d,%d,%d",&a,&b,&c);

其中用非格式符“ , ”作間隔符话侧,故輸入時應為:5,6,7。又如:

scanf("a=%d,b=%d,c=%d",&a,&b,&c);

則輸入應為:a=5,b=6,c=7闯参。

6) 如輸入的數(shù)據(jù)與輸出的類型不一致時瞻鹏,雖然編譯能夠通過,但結果將不正確鹿寨。

【例4-10】

#include

intmain(void){

inta;

printf("input a number\n");

scanf("%d",&a);

printf("%ld",a);

return0;

}

由于輸入數(shù)據(jù)類型為整型乙漓,而輸出語句的格式串中說明為長整型,因此輸出結果和輸入數(shù)據(jù)不符释移。如改動程序如下(【例4-11】):

#include

intmain(void){

longa;

printf("input a long integer\n");

scanf("%ld",&a);

printf("%ld",a);

return0;

}

運行結果為:

input a long integer

1234567890

1234567890

當輸入數(shù)據(jù)改為長整型后,輸入輸出數(shù)據(jù)相等寥殖。

【例4-12】

#include

intmain(void){

chara,b,c;

printf("input character a,b,c\n");

scanf("%c %c %c",&a,&b,&c);

printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);

return0;

}

輸入三個小寫字母玩讳,輸出其ASCII碼和對應的大寫字母。

【例4-13】

#include

intmain(void){

inta;

longb;

floatf;

doubled;

charc;

printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n",sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));

return0;

}

輸出各種數(shù)據(jù)類型的字節(jié)長度嚼贡。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熏纯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粤策,更是在濱河造成了極大的恐慌樟澜,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秩贰,居然都是意外死亡霹俺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門毒费,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丙唧,“玉大人,你說我怎么就攤上這事觅玻∠爰剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵溪厘,是天一觀的道長胡本。 經(jīng)常有香客問我,道長畸悬,這世上最難降的妖魔是什么侧甫? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮傻昙,結果婚禮上闺骚,老公的妹妹穿的比我還像新娘。我一直安慰自己妆档,他們只是感情好僻爽,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贾惦,像睡著了一般胸梆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上须板,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天碰镜,我揣著相機與錄音,去河邊找鬼习瑰。 笑死绪颖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的甜奄。 我是一名探鬼主播柠横,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼课兄!你這毒婦竟也來了牍氛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烟阐,失蹤者是張志新(化名)和其女友劉穎搬俊,沒想到半個月后紊扬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡唉擂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年餐屎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楔敌。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡啤挎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卵凑,到底是詐尸還是另有隱情庆聘,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布勺卢,位于F島的核電站伙判,受9級特大地震影響,放射性物質發(fā)生泄漏黑忱。R本人自食惡果不足惜宴抚,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甫煞。 院中可真熱鬧菇曲,春花似錦、人聲如沸抚吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楷力。三九已至喊式,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萧朝,已是汗流浹背岔留。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留检柬,地道東北人献联。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像何址,于是被迫代替她去往敵國和親酱固。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容