老師課件語言_第1頁
老師課件語言_第2頁
老師課件語言_第3頁
老師課件語言_第4頁
老師課件語言_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、計算機程序設(shè)計基礎(chǔ)(1)- C語言程序設(shè)計(3)sunjiason電子工程系信息認知與智能系統(tǒng)羅姆樓6-104:/627961932015.9.第 3 章數(shù)據(jù)的輸入與輸出3.13.23.33.4格式輸出函數(shù)格式輸入函數(shù)字符輸出函數(shù)字符輸入函數(shù)數(shù)據(jù)的輸入輸出函數(shù)把數(shù)據(jù)從計算機送到計算機外部設(shè)備上的操作稱為“輸出”。例如把計算機運算結(jié)果顯示在屏幕上或打印在紙上,或者送到磁盤 上保留起來。從計算機外部設(shè)備(鍵盤、磁盤、鼠標、掃描儀、USB設(shè)備等等)將數(shù)據(jù)送入計算機的操作稱為“輸入”。C語言本身并沒有提供輸入輸出語句。但可以通過調(diào)用標準庫函數(shù)提供的輸入和輸出函數(shù)來實現(xiàn)輸入和輸出。C語言提供了豐富的用于

2、輸入和輸出的庫函數(shù)。鍵盤顯示器文件文件內(nèi)存CPU輸入緩沖區(qū)輸出緩沖區(qū)鼠標掃描儀繪圖儀數(shù)據(jù)的輸入輸出函數(shù)數(shù)據(jù)的輸入與輸出應包括以下幾項:用于輸入或輸出的設(shè)備輸入或輸出數(shù)據(jù)的格式輸入或輸出的具體內(nèi)容在C語言中,提供了用于輸入與輸出的函數(shù),在這些函數(shù)中,鍵盤是標準輸入設(shè)備(stdin),顯示器是標準輸出設(shè)備(s輸入設(shè)備輸出設(shè)備另外要注意,如果在程序中要使用C語言所提供的輸入函數(shù)或輸出函數(shù),則在使用前(即在每個文件的開頭)應該使用包含()命令,將C語言中進行輸入與輸出的庫函數(shù)和常量變量等說明的(頭)文件包含進來:#include3.1 格式輸出函數(shù)3.1.1基本的格式輸出語句prf (“格式控制”,

3、輸出列表) ;格式控制部分要用一對雙引號括起來,它用于說明輸出項目所采用的格式。輸出列表中的各項目了所要輸出的內(nèi)容,格式是:輸出項1, 輸出項2, 輸出項n。在格式控制中,用于說明輸出數(shù)據(jù)格式的格式說明符總是以%開頭,后面緊跟的是具體的格式。格式說明符與輸出列表中的量是一一對應的,類型要一致,個數(shù)應該相同。用于輸出的常用格式說明符有以下幾種:1.整型格式說明符%d 或 %md%ld 或 %mld%hd 或 %mhd%u 或 %mu%lu 或 %mlu用于整型用于long長整型用于short短整型十進制形式用于無符號整型用于無符號long長整型%o 或 %mo%lo 或 %mlo用于整型八進制形

4、式用于long長整型%x 或 %mx%lx 或 %mlx用于整型十六進制形式用于long長整型m表示輸出的整型數(shù)據(jù)所占總寬度(即列數(shù)),當實際數(shù)據(jù)的位數(shù)不到m位時,數(shù)據(jù)前面將用空格補滿。如果在格式說明符中沒有用m來說明數(shù)據(jù)所占的寬度,則以輸出數(shù)據(jù)的實際位數(shù)為準。如果在格式說明符中說明了寬度m,但實際輸出的數(shù)據(jù)位數(shù)大于 m,則以輸出數(shù)據(jù)的實際位數(shù)進行輸出,自動突破場寬限制。2. 實型格式說明符%f 或 %m.nf%e 或 %m.ne%E 或 %m.nE十進制數(shù)形式指數(shù)形式在輸出實型數(shù)據(jù)時,格式說明符中的m表示整個數(shù)據(jù)所占的寬度,n表示小數(shù)點后面所占的位數(shù)。如果省略了m和n,那么%f, %e或%E

5、都將輸出6位小數(shù)(不包補0。括小數(shù)點),如果在小數(shù)點后取n位后,所規(guī)定的數(shù)據(jù)寬度m不夠輸出數(shù)據(jù)前面的整數(shù)部分(包括小數(shù)點),則按實際的位數(shù)進行輸出,自動突破場寬限制。的是,在C語言中,用于輸出單精度實型需要數(shù)據(jù)與雙精度實型數(shù)據(jù)格式說明符是一樣的。 3. 字符型格式說明符格式說明符為%c 或 %mc其中m表示輸出的寬度,即在這種情況下,在輸出字符的前將要補m-1個空格。下面對各種基本類型數(shù)據(jù)的格式輸出作幾點說明:輸出列表中可以有多個輸出項目,但各輸出項目之間要用“,”分隔。各輸出項目可以是常量、變量以及表達式。格式輸出函數(shù)中的“格式控制”是一個字符串,其中每一個%后面的字符是格式說明符,用于說明

6、相應輸出數(shù)據(jù)的輸出格式,而每一個格式說明符的結(jié)束符分別為 d(整型)、f(實型)、c(字符型)、s(字符串)等。而格式控制中除格式說明符外的其他字符將按原樣輸出?!纠?-1】設(shè)有以下程序:#include main( )a, b; float x, y, s;a=34; x=2.5f;b= -56; y=4.51f;s=x*x+y*y;pr prf(a=%d,b=%dn, a, b); f(x=%6.2f,y=%6.2f,s=%6.2fn,x, y, s);這個程序經(jīng)編譯a=34,b=-56后,運行輸出的結(jié)果為(表示一個空格):x=2.50,y=4.51,s=26.59如把【例3-1】的程序改

7、為:#include main( )a, b;float x,y,s;a=34; b= -56;x=2.5; y=4.51; s=x*x+y*y;prprf(a=%d,b=%dn, a,b);f(x=%6.2f,y=%6.2f,s=%6.2fn, x,y,s);結(jié)果為:這個程序編譯ex3_1.cex3_1.c(6) : warning C4305: “=”: 從“double”到“float”截斷出現(xiàn)warning錯誤的原因是:C語言默認所有浮點常數(shù)是double類型,以便以最大可能的精度數(shù)據(jù)。因此2.5, 4.51都會以double格式,當賦值給x, y這些float型變量時,需要把doub

8、le類型數(shù)據(jù)截斷(truncation)成float類型,從15位有效數(shù)字截斷為7位有效數(shù)字,有精度損失。因 此編譯系統(tǒng)給出警告信息提醒(如果沒有誤差不出現(xiàn)警告信息)。為了防止出現(xiàn)警告信息,語句改為:x=2.5f; y=4.51f; /* 2.5,4.51以float格式*/或: x=(foat)2.5; y= (foat)4.51;/* 強制轉(zhuǎn)換成float */而將【例3-1】程序改為:#include main( )a, b;double x, y, s; a=34; b= -56;/*float 改為 double */x=2.5; y=4.51; s=x*x+y*y;prprf(a=

9、%d,b=%dn, a, b);f(x=%6.2f,y=%6.2f,s=%6.2fn, x, y, s);程序編譯將不會出現(xiàn)任何錯誤信息。格式輸出函數(shù)的執(zhí)行過程如下:首先,在計算機內(nèi)存中開辟一個輸出緩沖區(qū),用于存放輸出項目表中各項目數(shù)據(jù)。然后,依次計算項目表中各項目(常量或變量或表達式)的值,并按各項目數(shù)據(jù)類型應占的字節(jié)數(shù)依次將它們存入輸 出緩沖區(qū)中。最后,根據(jù)“格式控制”字符串中的各格式說明符依次 從輸出緩沖區(qū)中取出若干字節(jié)的數(shù)據(jù)(如果是非格式說明符,則將按原字符輸出),轉(zhuǎn)換成對應的十進制數(shù)據(jù)進行輸出。 其中從輸出緩沖區(qū)中取多少個字節(jié)的數(shù)據(jù)是按照對應格式說 明符說明的數(shù)據(jù)類型。在“格式控制”

10、的格式說明符中,如果帶有寬度說明,則 在左邊沒有數(shù)字的位置上用空格填滿(即輸出的數(shù)字是右對齊)。但如果在寬度說明前加一個負號(-),則輸出為左對齊,即在右邊補空格?!纠?-2】 設(shè)有如下C程序:#include main( )xx,yy,zz;xx=1; yy=-65535;zz=1;prpr prf(xx=%ld, yy=%ld, zz=%ldn, xx, yy, zz);f(xx=%hd, yy=%hd, zz=%hdn, xx, yy, zz); f(xx=%d, yy=%d, zz=%dn, xx, yy, zz);該程序運行的結(jié)果如下:xx=1, yy=-65535, zz=1 xx

11、=1, yy=1, zz=1xx=1, yy=-65535, zz=1【例3-3】設(shè)有如下C程序:#include main( ) double x=34.567;顯然,這個程序中的第二個格式輸出語句輸出的結(jié)果是錯誤的,這是因為在第二個格式輸出語句中,格式說明符%d是基本整型格式說明符,而輸出項目是雙精度型的數(shù)據(jù),它們是不匹配的。pr prprf(x=%fn, x);f(x=%dn, x);f(x=%dn, ()x);這個程序的實際運行結(jié)果為:x=34.567000 x=1958505087 x=34 注意:強制轉(zhuǎn)化時不四舍五入如果將例3.1中的程序改成如下:#include main( )a

12、, b; float x, y, s; a=34; b= -56;x=2.5f; y=4.51f; s=x*x+y*y;prprf(a=%d, b=%dn, a, b);f(x=%-6.2f, y=%-6.2f, s=%-6.2fn, x, y, s);則這個程序經(jīng)編譯a=34, b=-56后,運行輸出的結(jié)果為x=2.50 , y=4.51 , s=26.59 即在輸出的寬度范圍內(nèi),因為左對齊,空格補在數(shù)據(jù)的后面。3.1.2prf函數(shù)中常用的格式說明格式控制中,每個格式說明都必須用“%”開頭,以一個格式字符作為結(jié)束,在此之間可以根據(jù)需要明”、左對齊符號“”、前導零符號“0”等。1格式字符“寬度

13、說%后允許使用的格式字符和它們的功能如表3.1所示。在某些系統(tǒng)中,可能不允許使用大寫字母的格式字符。因此為了使程序具有通用性,在寫程序時,盡量不用大寫字母的格式字符。2長度修飾符在%和格式字符之間,可以加入長度修飾符,以保證數(shù) 據(jù)輸出格式的正確和對齊。對于長整型數(shù)(long)應該加l,如%ld。對于短整型數(shù)(short)可以加h,如%hd。格式字符說明c輸出一個字符d或i輸出帶符號的十進制整型數(shù),%ld為長整型,%hd為短整型o以八進制格式輸出整型數(shù),%o不帶先導0;%#o加先導0 x或X以十六進制格式輸出整型數(shù),但不帶先導0 x或0X。%#x或%#X輸出帶先導0 x或0X的十六進制數(shù)u以無符

14、號十進制形式輸出整型數(shù)f以帶小數(shù)點的數(shù)學形式輸出浮點數(shù)(單精度和雙精度數(shù))e或E以指數(shù)形式輸出浮點數(shù)(單精度和雙精度數(shù)),格式是:-m.dddddde/E。小數(shù)位數(shù)(d的個數(shù))由輸出精度決定,隱含是6。若指定的精度為0,則連小數(shù)點在內(nèi)的小數(shù)部分都不輸出g或G由系統(tǒng)決定用%f還是用%e(或E)輸出,以使輸出寬度最小s輸出一個字符串,直到遇到0。若字符串長度超過指定的精度則自動突破,不會截斷字符串p輸出變量的內(nèi)存地址%也就是%形式,輸出一個%3. 輸出數(shù)據(jù)所占的寬度說明當使用%d、%c、%f、%e、%s、的格式說明時,輸 出數(shù)據(jù)所占的寬度(域?qū)挘┯上到y(tǒng)決定,通常按照數(shù)據(jù)本身 的實際寬度輸出,前后不

15、加空格,并采用右對齊的形式。但可以用以下3種方法人為控制輸出數(shù)據(jù)所占的寬度(域?qū)挘凑帐褂谜叩囊庠高M行輸出。(1)在%和格式字符之間一個整數(shù)常數(shù)來指定輸出的寬度n(例如%4d,n代表整數(shù)4)。如果指定的寬度n不夠,輸出時將會自動突破,保證數(shù)據(jù)完整輸出。如果指定的寬度 n超過輸出數(shù)據(jù)的實際寬度,輸出時將會右對齊,左邊補以空格,達到指定的寬度。(2)對于float和double類型的實數(shù),可以用“n1.n2”的形式來指定輸出寬度(n1和n2分別代表一個整常數(shù)),其中n1指定輸出數(shù)據(jù)的寬度(包括小數(shù)點),n2指定小數(shù)點后小數(shù)位的位數(shù),n2也稱為精度(例如%12.4f,n1代表整數(shù)12,n2代表整數(shù)

16、4)。對于f、e或E,當輸出數(shù)據(jù)的小數(shù)位多于n2位時,截去右 邊多余的小數(shù),并對截去部分的第一位小數(shù)做四舍五入處理;當輸出數(shù)據(jù)的小數(shù)位少于n2時,在小數(shù)的最右邊補0,使得 輸出數(shù)據(jù)的小數(shù)部分寬度為n2。若給出的總寬度n1小于n2加 上整數(shù)位數(shù)和小數(shù)點(e或E格式還要加上指數(shù)的5位),則 自動突破n1的限制;反之,數(shù)字右對齊,左邊補空格。也可以用“.n2”格式(例如%.6f),不指定總寬度,僅 指定小數(shù)部分的輸出位數(shù),由系統(tǒng)自動突破,按照實際寬度 輸出。如果指定“n1.0”或“.0”格式(例如%12.0f或%.0f),則不輸出小數(shù)點和小數(shù)部分。對于g或G,寬度用來指定輸出的有效數(shù)字位數(shù)。若寬度超

17、過數(shù)字的有效數(shù)字位數(shù),則左邊自動補空格;若寬度,則自動突破。不指定寬度,將自動按照6位有效數(shù)字輸出,截去右邊多余的小數(shù),并對截去部分的第一位小數(shù)做四舍五入處理。(3)對于整型數(shù),若輸出格式是“0n1”或“.n2”格式(例如%05d或%.5d),如果指定的寬度超過輸出數(shù)據(jù)的實際寬度,輸出時將會右對齊,左邊補以0。對于字符串,格式“n1”指定字符串的輸出寬度,若n1小于字符串的實際長度,則自動突破,輸出整個字符串;若 n1大于字符串的實際長度,則右對齊,左邊補空格。若用 “.n2”格式指定字符串的輸出寬度,則若n2小于字符串的實際長度,將只輸出字符串的前n2個字符(將字符串截斷!)。注意:輸出數(shù)據(jù)

18、的實際精度并不完全取決與格式控制中的域?qū)捄托?shù)的域?qū)挘侨Q于數(shù)據(jù)在計算機內(nèi)的精度。通常系統(tǒng)只能保證float類型有7位有效數(shù)字,double類型有15位有效數(shù)字。若你指定的域?qū)捄托?shù)的域?qū)挸^相應類型數(shù)據(jù)的有效數(shù)字,輸出的多余數(shù)字是沒有意義的,只是系統(tǒng)用來填充域?qū)挾选?. 輸出數(shù)據(jù)左對齊由于輸出數(shù)據(jù)都隱含右對齊,如果想左對齊,可以在格式控制中的“%”和寬度之間加一個“-”號來實現(xiàn)。5. 使輸出數(shù)據(jù)總帶+號或-號通常輸出數(shù)據(jù),如果負數(shù),前面有符號位“-”,但正數(shù)的“+”都省略了。如果要每一個數(shù)前面都帶正負號,可以在%和格式字符間加一個“+”號來實現(xiàn)。舉例:若k為型,值為1234,f為dou

19、ble型,值為123.456。下表列舉了各種輸出寬度和不指定寬度情況下的輸出結(jié)果。k=1234;double f =123.456;輸出語句輸出結(jié)果 prf(%dn, k);1234prf(%6dn, k);1234 prf(%2dn, k);1234 prf(%fn, f);123.456000prf(%12fn, f);123.456000prf(%12.6fn, f);123.456000 prf(%2.6fn, f);123.456000 prf(%.6fn, f);123.456000 prf(%12.2fn, f);123.46 prf(%12.0fn, f);123 prf(%.

20、fn, f);123 prf(%en, f);1.234560e+002 prf(%13en, f);1.234560e+002 prf(%13.8en, f);1.23456000e+002prf(%3.8en, f);1.23456000e+002 prf(%.8en, f);1.23456000e+002 prf(%13.2en, f);1.23e+002 prf(%13.0en, f);1e+002 prf(%.0en, f);1e prf(%gn, f);.456 prf(%5gn, f);123.456 prf(%10gn, f);123.456 prf(%gn, 123.4567

21、89);123.457 prf(%06dn, k);001234 prf(%.6dn, k);001234 prf(%012.6fn, f);00123.456000 prf(%013.2en, f);00001.23e+002 prf(%sn, abcdefg);abcdefg prf(%10sn, abcdefg);abcdefg prf(%5sn, abcdefg);abcdefg prf(%.5sn, abcdefg);abcdeprf(%-6dn, k);1234prf(%-12.2fn, f);123.46prf(%-13.2en, f);1.23e+002prf(%+-6d%+-

22、12.2fn, k, -f);.46prf(%4.1f%n, 12.5);12.5%3.1.3 使用prf函數(shù)時的注意事項1prf的輸出格式為格式,是否在兩個數(shù)之間留逗號、空格或回車,完全取決于你的格式控制,如果不注意,很容易造成數(shù)字連在一起, 使得輸出結(jié)果沒有意義。例如:prf(%d%d%fn, k, k, f); 語句的輸出結(jié)果是:12341234123.456000,無法分辨其中的數(shù)字含義。而如果改為prf(%d %d %fn, k, k, f);輸出結(jié)果是:12341234123.456000看起來就一目了然。格式控制中必須含有與輸出項一一相對應的輸出格式說明,類型必須匹配。若格式說明

23、與輸出項的類型不一一對應匹配,則不能正確輸出。而且編譯時不會報錯。若格式說明個數(shù)少 于輸出項個數(shù),則多余的輸出項不予輸出;若格式轉(zhuǎn)換說明 個數(shù)多于輸出項個數(shù),則將輸出一些毫無意義的數(shù)字亂碼。在格式控制中,除了前面要求的輸出格式,還可以包含任 意的合法字符(包括漢字和轉(zhuǎn)義符),還可利用n(回車)、 r(回行但不回車)、t(制表)、a(響鈴)等控制格式。這些字符輸出時將“原樣照印”。4如果要輸出%符號,可以在格式控制中用%表示,將輸出一個%符號。5prf函數(shù)有返回值,返回值是本次調(diào)用輸出字符的個數(shù),包括回車等控制符。6盡量不要在輸出語句中改變輸出變量的值,因為可能會造成輸出結(jié)果的不確定性。例如:k

24、=8; prf(“%d,%dn”, k, +k); 輸出結(jié)果不是你預想的8,9,而是9,9。這是因為調(diào)用函數(shù)pr左進行傳遞的,將先進行+k運算。7輸出數(shù)據(jù)時的域?qū)捒梢愿淖?。f時,其參數(shù)是從右至若變量m 、 n 、 i 和f 都已正確定義并賦值, 則語句prf(%*d, m, i); 將按照m指定的場寬輸出i的值,并不輸出m的值。而語句prf(%*.*f, m, n, f); 按照m和n指定的場寬輸出浮點型變量f的值,并不輸出m、n的值。這被稱作 變場寬輸出3.2格式輸入函數(shù)3.2.1基本的格式輸入語句scanf(格式控制, 內(nèi)存地址表);其中scanf( )是C編譯系統(tǒng)提供的格式輸入函數(shù)。格式

25、控制部分要用一對雙引號括起來,它用于說明輸入數(shù)據(jù)時應使用的格式。內(nèi)存地址表中的各項目內(nèi)存地址。各輸入數(shù)據(jù)所存放的與格式輸出一樣,在格式控制中,用于說明輸入數(shù)據(jù)格式的格式說明符總是以%開頭,后面緊跟的是具體的格式。用于數(shù)據(jù)輸入的常用格式說明符有以下幾種:1.整型格式說明符%d 或 %md%ld 或 %mld%u 或 %mu%lu 或 %mlu用于一般整型十進制形式用于long長整型用于無符號整型用于無符號long長整型%o 或 %mo%lo 或 %mlo用于一般整型八進制形式用于long長整型%x 或 %mx%lx 或 %mlx用于一般整型十六進制形式用于long長整型由此可以看出,用于輸入與輸

26、出整型數(shù)據(jù)的格式說明符是完全一樣的。m表示輸入數(shù)據(jù)時的寬度(即列數(shù))。與輸出情形一樣,對于八進制形式與十六進制形式的輸入格式,主要用于輸入無符號整型的數(shù)據(jù)。 2. 實型格式說明符單精度實型%f 或%e%lf 或 %le雙精度實型由此可以看出,與輸出不同,在用于輸入時,無論是單精度實型還是雙精度實型,都不能用m.n來指定輸入的寬度和小數(shù)點后的位數(shù)。3. 字符型格式說明符用于輸入的字符型格式說明符為%c下面是用到格式輸入的一個程序:#includemain( )a; float b; char c;scanf(%d%f%c, &a, &b, &c);下面對格式輸入作幾點說明:在格式輸入中,內(nèi)存地址

27、表中的各項目必須是變量地址,而不能是變量名,且彼此間用“,”分隔。為此,C語言專門提供了一個取地址運算符&。例如,&a表示變量a在內(nèi)存中的地址。當用于輸入整型數(shù)據(jù)的格式說明符中沒有寬度說明時,則在具體輸入數(shù)據(jù)時分為以下兩種情況: 如果各格式說明符之間沒有其他字符,則在輸入數(shù)據(jù)時,兩個數(shù)據(jù)之間用空格、或Tab、或回車來分隔。 如果各格式說明符之間包含其他字符,則在輸入數(shù)據(jù)時,應輸入與這些字符相同的字符作為間隔。例如,設(shè)有如下說明a, b ;float c, d ;現(xiàn)要利用格式輸入函數(shù)輸入數(shù)據(jù),使得:a=12, b=78, c=12.5, d=7.6。采用不同的格式說明, 其輸入數(shù)據(jù)的形式也是不同

28、的。輸入語句為scanf(%d%d%f%f, &a, &b, &c, &d);(即格式說明符中沒有寬度說明,各格式說明符之間也沒有其他字符)則輸入數(shù)據(jù)的形式應為12 78 12.5 7.6(兩個數(shù)據(jù)之間用空格來分隔,當然也可用“Tab”或“回車”來分隔)輸入語句為 scanf(%d, %d, %f, %f, &a, &b, &c, &d);(格式說明符中沒有寬度說明,但各格式說明符之間有其他字符:逗號)則輸入數(shù)據(jù)的形式應為12, 78, 12.5, 7.6(即在輸入的兩個數(shù)據(jù)之間同時要輸入逗號)輸入語句scanf(a=%d, b=%d, c=%f, d=%f, &a, &b, &c, &d);

29、(即格式說明符中沒有寬度說明,但各格式說明符之間有其他字符)輸入數(shù)據(jù)的形式應為a=12, b=78, c=12.5, d=7.6(即在輸入的兩個數(shù)據(jù)之間同時要輸入這些非格式說明符的字符)當整型或字符型格式說明符中有寬度說明時,按寬度說明截取數(shù)據(jù)?!纠?-4】設(shè)有以下程序:#include main( )特別要注意的是:一個字符型變量只能存放一個字符。a, d; char b, c;prf(input a, b, c, d:);scanf(%3d%3c%2c%2d, &a, &b, &c, &d);prf(a=%d, b=%c, c=%c, d=%dn, a, b, c, d);若從鍵盤輸入如下

30、(其中 input a, b, c, d : 為輸出的字符串):input a, b, c, d: 12345678901234563d 3c 2c 2d則它們與各格式說明符之間的對應關(guān)系如上,最后賦給各變量的值為a=123, b=4, c=7, d=90但運行時會出現(xiàn)致命錯誤,原因是,當按照3c格式把字符456給b賦值時,雖然字符4賦值給了b,但隨后的字符5和6放到了b之后的內(nèi)存中,造成了內(nèi)存越界,引起致命錯誤。按照2c把字符78給c,因此以后不能再使用%mc (m1)格式給賦值存在同樣char型變量讀入字符值。在用于輸入的實型格式說明符中不能用m.n來指定輸出的寬度和小數(shù)點后的位數(shù)(這是與

31、輸出的不同之處)。例如,下列寫法是錯誤的:scanf(%7.2f, &a);為了便于程序執(zhí)行過程中從鍵盤輸入數(shù)據(jù),在一個C程序開始執(zhí)行時,系統(tǒng)就在計算機內(nèi)存中開辟了一個輸入緩沖區(qū),用于暫存從鍵盤輸入的數(shù)據(jù)。開始時該輸入緩沖區(qū)是空的。當執(zhí)行到一個輸入函數(shù)時,就檢查輸入緩沖區(qū)中是否有數(shù)據(jù):如果輸入緩沖區(qū)中已經(jīng)有數(shù)據(jù)(上一個輸入函數(shù)讀剩下 的),則依次按照“格式控制”中的格式說明符從輸入緩沖區(qū)中取出數(shù)據(jù)轉(zhuǎn)換成計算機中的表示形式(二進制),最后存放到內(nèi)存地址表中的對應地址的內(nèi)存中。如果輸入緩沖區(qū)中沒有數(shù)據(jù)(即輸入緩沖區(qū)為空),則等待用戶從鍵盤輸入數(shù)據(jù)并依次存放到輸入緩沖區(qū)中。當輸入一個或符后,將依次按

32、照“格式控制”中還未用過的格式說明符從輸入緩沖區(qū)中取出數(shù)據(jù)轉(zhuǎn)換成計算機中的表示形式(二進制),最后存放到內(nèi)存地址表中的對應地址中。在上述兩種中的任一種情況下,從輸入緩沖區(qū)中取數(shù)據(jù),如果遇到或字符,則將輸入緩沖區(qū)清空。此時如果“格式控制”中的格式說明符還未用完,則繼續(xù)等待用戶從鍵盤輸入數(shù)據(jù)并依次存放到輸入緩沖區(qū)中,直到輸入一個或符后,再依次按照“格式控制“中還未用過的格式說明符從輸入緩沖區(qū)中取出數(shù)據(jù)轉(zhuǎn)換成計算機中的表示形式(二進制),最后存放到內(nèi)存地址表中的對應地址的內(nèi)存中。這個過程直到“格式控制”中的格式說明符用完為止。此時如果輸入緩沖區(qū)中的數(shù)據(jù)還未取完,則將留給下一個輸入函數(shù)使用。從以上輸入

33、函數(shù)的執(zhí)行過程可以看出,從鍵盤輸入數(shù)據(jù)是以或作為結(jié)束的。當輸入的數(shù)據(jù)一行不夠時,可以在下一行繼續(xù)輸入; 當一行上的數(shù)據(jù)用不完時,可以留給下一個輸入函數(shù)使用。需要注意的是,由于或是作為鍵盤輸入數(shù)據(jù)的結(jié)束符,因此,在輸入函數(shù)的格式控制中,最后不能加換行符n。與格式輸出一樣,格式輸入的格式控制中的各格式說明符與內(nèi)存地址表中的變量地址在個數(shù)、次序、類型方面必須一一對應。尤其要注意:不存在用寬輸入格式可以正確讀入窄變量的可能!double變量用%f不能正確讀入 float變量用%lf也不能正確讀入顯然,輸出語句輸出的x值是錯誤的。這是因為,x定義為雙精度型的實型變量(占8個字節(jié)),但它使用的是單精度實型

34、的輸入格式說明符。當輸入一個實型數(shù)123.456后,將按照單精度輸入格式說明符將它轉(zhuǎn)換成計算機中的表示形式(只占4個字節(jié)),最后存放到為雙精度實型變量x所分配【例3-5】設(shè)有C程序如下:#include main( ) doublex;prf(input x:);scanf(%f, &x);prf(x=%gn, x);這個程序的運行結(jié)果為:(其中有下劃線的部分為鍵盤輸入)input x:123.456x=-9.25596e+061的空間的低4個字節(jié)中,而為雙精度實型變量x所分配的空間的高4個字節(jié)中的各位均是未初始化的隨機數(shù),這就造成雙精度實型變量x的 (階碼N-2)的11位偏移碼為不可預知的數(shù)

35、,輸出結(jié)果將是一個毫無意義的數(shù)。將【例3-5】 scanf 中%f 改為 %lf , 則能正確讀入:#include main( ) double x;prf(input x:);scanf(“%lf”, &x);/* 將 %f 改為 %lf , 則能正確讀入*/prf(x=%gn, x);這個程序的運行結(jié)果為(其中有下劃線的部分為鍵盤輸入)input x:123.456x=123.4563.2.2scanf函數(shù)中常用的格式說明每個格式說明都必須用%開頭,以一個“格式字符”作為結(jié)束。通常允許用于輸入的格式字符和相應功能如下表所示。格式字符說明c輸入一個字符d輸入帶符號的十進制整型數(shù)i輸入整型數(shù)

36、,整型數(shù)可以是帶先導 0 的八進制數(shù),也可以是帶先導0 x(或0X)的十六進制數(shù)以八進制格式輸入整型數(shù),可以帶先導0,也可以不帶ox以十六進制格式輸入整型數(shù),可以帶先導0 x或0X,也可以不帶u以無符號十進制形式輸入整型數(shù)f(lf)以帶小數(shù)點的數(shù)學形式或指數(shù)形式輸入浮點數(shù)(單精度用f,雙精度數(shù)用lf)e(le)同上s輸入一個字符串,直到遇到0。若字符串長度超過指定的精度則自動突破,不會截斷字符串說明:在格式串中,必須含有與輸入項一一相對應的格式轉(zhuǎn)換說明符。若格式說明與輸入項的類型不一一對應匹配,則不能正確輸入,而且編譯時不會報錯。若格式說明個數(shù)少于輸入項個數(shù), scanf函數(shù)結(jié)束輸入,則多余的

37、輸入項將無法得到正確的輸入值;若格式轉(zhuǎn)換說明個數(shù)多于輸入項個數(shù),scanf函數(shù)也結(jié)束輸入。多余的數(shù)據(jù)作廢,不會作為下一個輸入語句的數(shù)據(jù)。在VS2008編譯環(huán)境下,輸入short型整數(shù),格式控制必須用%hd。要輸入double型數(shù)據(jù),格式控制必須用%lf(或確輸入。%le)。否則,數(shù)據(jù)不能正在scanf函數(shù)的格式字符前可以加入一個正整數(shù)指定輸入數(shù)據(jù)所占的寬度。但不可以對實數(shù)指定小數(shù)位的寬度。由于輸入是一個字符流,scanf從這個流中按照格式控制指定的格式出相應數(shù)據(jù),送到指定地址的變量中。因此當輸入的數(shù)據(jù)少于輸入項時,運行程序等待輸入,直到滿足要求為止。當輸入的數(shù)據(jù)多于輸入項時,多余的數(shù)據(jù)在輸入流

38、中沒有作廢,而是等待下一個輸入操作語句繼續(xù)從此輸入流數(shù)據(jù)。(5)scanf函數(shù)有返回值,其值就是本次scanf調(diào)用正確輸入的數(shù)據(jù)項的個數(shù)。3.2.3 通過scanf函數(shù)從鍵盤輸入數(shù)據(jù)當用scanf函數(shù)從鍵盤輸入數(shù)據(jù)時,每行數(shù)據(jù)在未按下回車鍵(Enter鍵)之前,可以任意修改。但按下回車鍵(Enter鍵)后,s數(shù)據(jù)就送入了輸入緩沖區(qū),canf函數(shù)即接受了這一行數(shù)據(jù),不能再回去修改。1輸入數(shù)值數(shù)據(jù)在輸入整數(shù)或?qū)崝?shù)這類數(shù)值型數(shù)據(jù)時,輸入的數(shù)據(jù)之間必須用空格、回車符、 制表符(TAB鍵) 等此類間隔符隔開,間隔符個數(shù)不限。即使在格式 說明中人為指定了輸入寬度,也可以用此方式輸入。例如:若k為類型變量,

39、a為float類型變量,y為double類型變量,有以下輸入語句:scanf ( %d%f%le, &k, &a, &y );若要給k賦值10,a賦值12.3,y賦值1234567.89,輸入格式可以是(輸入的第一個數(shù)據(jù)之前可有任意空格):1012.31234567.89 此處表示回車鍵。也可以是:1012.31234567.89只要能把3個數(shù)據(jù)正確輸入,可以按間隔符。添加2指定輸入數(shù)據(jù)所占的寬度可以在格式字符前加入一個正整數(shù)指定輸入數(shù)據(jù)所占的寬度。例如上例改為:scanf(%3d%5f%5le, &k, &a, &y);若從鍵盤上從第1列開始輸入:123456.789.123用pr123f(

40、%d%f %fn, k, a, y);打印的結(jié)果是:456.70000089.120000可以看到,由于格式控制是%3d,因此把輸入數(shù)字串的前三位123賦值給了k;由于對應于變量a的格式控制是%5f,因此把輸入數(shù)字串中隨后的5位數(shù)(包括小數(shù)點)456.7賦值給了a;由于格式控制是%5e,因此把數(shù)字串中隨后的5位(包括小數(shù)點) 89.12賦值給了y。由以上示例可知,數(shù)字之間不需要間隔符,若插入了間隔符,系統(tǒng)也將按指定的寬度來數(shù)據(jù),從而會引起輸入。除非數(shù)字一開始就是“粘聯(lián)”在一起,否則不提倡指定輸入數(shù)據(jù)所占的寬度。3跳過某個輸入數(shù)據(jù)可以在%和格式字符之間加入“*”號,作用是跳過對應的輸入數(shù)據(jù)。例如

41、:x, y, z;scanf(%d%*d%d%d, &x, &y, &z);prf(%d%d%dn, x, y, z);若是輸入:12345678則輸出是:125678系統(tǒng)將12賦給x,跳過34,把56賦給y,把78賦給z。4在格式控制字符串中其它字符scanf函數(shù)中的格式控制字符串是為了輸入數(shù)據(jù)用的,無論其中字符,也不會輸出到屏幕上,因此若想在屏幕上輸出提示信息,應該首先使用prf函數(shù)輸出。例如:x, y, z;scanf(Please input x,y,z : %d%d%d, &x, &y, &z);屏幕上不會輸出Please input x,y,z :,求輸入數(shù)據(jù)時按照一一對應的位置原

42、樣輸入這些字符。必須從第一列起以下面的形式進行輸入:Please input x,y,z: 12 34 56包括Pleaseinputx,y,z、字符的大小寫、字符間的間格等必須與scanf中的完全一致。這些字符又被稱為通配符。但如果使用以下的形式:x, y, z ;prf(Please input x,y,z: );scanf(%d%d%d, &x, &y, &z);由于prf語句的輸出,屏幕上將出現(xiàn)提示:Please input x,y,z:,只需按常規(guī)輸入下面的數(shù)據(jù)即可:123456如果在以上scanf中,在每個格式說明之間加一個逗號作為通配符:scanf(%d,%d,%d, &x, &y, &z);則輸入數(shù)據(jù)時,必須兩個數(shù)據(jù)后面緊跟一個逗號,以便與格式控制中的逗號一一匹配,否則就不能正確讀入數(shù)據(jù)運行。運行。例如,輸入:12,34,56能正確讀入。輸入:12,34,56也能正確讀入。因為空格是間隔符,將全部被忽略掉。但輸入:12,34,56將不能正確讀入,因

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論