關于我們
書單推薦
新書推薦
|
C程序設計
本書內容包括三個方面: 1)程序的基本構造, 如程序的三種基本結構、函數、常量、變量等; 2)程序的構造方法, 如函數分解、遞歸、常見算法等; 3)程序的數據描述, 如數組、結構體、文件等。全書以C語言為載體, 不僅介紹了C語言的基本語法, 更重要的是, 通過C語言的語法元素展示了如何構造出一個個完整的程序。
全書以C語言為載體,不僅介紹了C語言的基本語法,更重要的是通過C語言的語法元素展示了如何構造出一個個完整的程序。
與已有的C語言教材相比,本書存在以下特點:
結構上有所突破。本書不是采用傳統(tǒng)的條塊式結構,而是采用層次結構,即先介紹一個C語言核心,然后再對這個核心進行擴展。
內容組織上有所創(chuàng)新。將文件的基本讀寫操作提前,讓學生更熟悉C文件操作,強化文件操作的訓練,并增強例題的趣味性、綜合性和實用性;增加C程序運行機制的介紹,如變量內存分配(變量、指針、靜態(tài)變量)、內存布局(堆、棧函數調用)、緩沖區(qū)等,讓學生理解C程序運行的背后計算機在發(fā)生什么。
精選例題。將例題分為驗證性例題和示范性例題。驗證性例題純粹是為了驗證和演示某一個知識點,而示范性例題不僅演示了某一用法,更具有示范意義,值得提煉,值得熟記,利于學生形成自己的算法思維,提高程序設計的綜合素質和能力。
強調規(guī)范化、工程化的開發(fā)。介紹了一些常見的工程實踐中的做法,如代碼風格、命名、程序計時、軟件測試等,并強調軟件工程中功能分解、函數封裝等原則。
程序設計類課程是計算機科學與技術及相關專業(yè)的基礎課程,在計算機專業(yè)課程體系建設中占有十分重要的地位,對于培養(yǎng)學生的思維、能力和興趣具有十分重要的作用。本書的定位是*門程序設計類課程的教材。
本書圍繞程序設計展開,內容包括3個方面:
程序的基本構造,如程序的3種基本結構、函數、常量、變量等;
程序的構造方法,如函數分解、遞歸、常見算法等;
程序的數據組織,如數組、結構體、文件等。
全書以C語言為載體,不僅介紹了C語言的基本語法,更重要的是通過C語言的語法元素展示了如何構造出一個完整的程序。
與已有的C語言教材相比,本書具有以下特點:
1) 結構上有所突破
在結構上,本書不是采用傳統(tǒng)的條塊式結構,即按照知識點一個一個地介紹,而是采用層次結構,即先介紹一個C語言核心,其中包括了C語言*常見的用法,然后再對這個核心進行擴展。實踐證明,這種結構更容易被學生接受,教學效果更好。
2) 內容組織上有所創(chuàng)新
在內容組織上,有以下兩點創(chuàng)新:
(1) 將文件的基本讀寫操作提前到輸入輸出章節(jié)(第3章)。這樣安排的好處是: 一方面讓學生更加熟悉C文件操作,強化了文件操作的訓練;另一方面可以增強例題的趣味性、綜合性和實用性,更容易引起學生的興趣。
(2) 增加C程序運行機制的介紹。C語言很多知識點與計算機硬件有著緊密的聯(lián)系,如變量內存分配(變量、指針、靜態(tài)變量)、內存布局(堆、棧函數調用)、寄存器(寄存器變量)、緩沖區(qū)等,要深入地理解C程序不可避免地涉及基本的計算機系統(tǒng)原理。在本書中,專設一章把這些內容串起來,讓學生理解C程序運行的背后計算機在發(fā)生什么。
3) 精選例題
本書的例題經過了精心的選擇和組織。根據例題的性質,將例題分為驗證性例題和示范性例題。驗證性例題純粹是為了驗證和演示某一個知識點。例如,在printf函數中用%d、%o和%x等不同格式來輸出一個整數,通過這個例子,可以驗證不同格式符的不同。而示范性例題不僅演示了某一用法,更具有示范意義,值得提煉,值得熟記。例如,判斷一個數是否為素數的例子,毫無疑問需要學生完全掌握。本書中的示范性例題都經過了精心挑選,值得好好學習和品讀(為了區(qū)分,示范性例題在例題編號后加了一個星號,如例2.6)。本書也注重對例題的分析,盡量讓學生通過一個題目掌握一類題目的解法。
4) 強調規(guī)范化、工程化的開發(fā)
程序設計具有很強的工程化屬性,因此本書也一直強調程序設計的規(guī)范化和工程化思想,書中介紹了一些常見的工程實踐中的做法,如代碼風格、命名、程序計時、軟件測試等,并強調軟件工程中功能分解、函數封裝等原則。
另外,為了方便讀者查找和復習,本書提供了電子版的例題索引;為了方便教學,本書還提供了電子版的PPT演示文稿。讀者可以到清華大學出版社網站免費下載。
本書是在《C語言與程序設計方法》(第2版)(萬常選、舒蔚、駱斯文、劉喜平編著)的基礎上編寫的。其中,第1~5、9、14~15章由劉喜平編寫,第6、8、10、13章由萬常選編寫,第7、11章由舒蔚編寫,第12章由駱斯文編寫。劉喜平、萬常選提出本書的編寫大綱,并對全書的初稿進行了修改、補充和總纂。
本書在編寫過程中參閱了大量的參考文獻,在此對參考書目的作者表示衷心感謝!
由于水平有限,加上編寫時間倉促,書中難免會有不少缺點或錯誤,敬請專家和讀者批評指正。
作者
2017年1月
第1章程序設計與軟件開發(fā)11.1程序設計的基本概念1
1.1.1程序1
1.1.2程序設計語言2
1.1.3程序設計4
1.2算法與數據結構7
1.2.1算法及其特征7
1.2.2算法的結構9
1.2.3算法的描述10
1.2.4數據結構14
1.3軟件開發(fā)16
1.3.1軟件16
1.3.2軟件工程16
1.4本章小結17
習題119
第2章C語言概述202.1C語言的發(fā)展與特點20
2.1.1C語言的發(fā)展20
2.1.2C語言的特點21
2.2一個C程序實例22
2.2.1編寫和運行C程序23
2.2.2注釋23
2.2.3預處理命令24
2.2.4程序主體24
2.3C語言的字符集與標識符26
2.4數據類型27C程序設計:方法與實踐目錄2.5常量和變量28
2.5.1常量28
2.5.2變量28
2.6運算符和表達式30
2.6.1運算符30
2.6.2表達式32
2.7輸入與輸出33
2.7.1輸出函數printf33
2.7.2輸入函數scanf34
2.8語句36
2.8.1簡單語句36
2.8.2語句塊36
2.8.3if語句37
2.8.4while語句39
2.8.5for語句39
2.9函數41
2.10編程實踐: 代碼風格42
2.11本章小結44
習題248
第3章數據類型與輸入輸出493.1整型50
3.1.1整數的內部表示51
3.1.2整型常量51
3.1.3整數的輸出52
3.1.4整數的輸入55
3.2浮點型57
3.2.1浮點常量58
3.2.2浮點數的內部表示58
3.2.3浮點數的輸出58
3.2.4浮點數的輸入60
3.2.5浮點數的比較和計算60
3.3字符型62
3.3.1字符型數據的內部表示62
3.3.2字符常量和變量63
3.3.3字符輸出64
3.3.4字符輸入65
3.3.5字符處理66
3.4數組68
3.4.1什么是數組68
3.4.2數組的內部表示69
3.4.3數組元素的訪問69
3.4.4數組的初始化70
3.5字符串71
3.5.1字符串常量71
3.5.2用字符數組處理字符串72
3.5.3字符串的輸出73
3.5.4字符串的輸入74
3.6文本文件輸入與輸出77
3.6.1聲明FILE 類型的變量78
3.6.2打開文件78
3.6.3關閉文件79
3.6.4讀寫文件79
3.7變量的進一步討論81
3.7.1變量的聲明與初始化81
3.7.2限定詞const82
3.8編程實踐: 命名82
3.9本章小結83
習題386
第4章運算符與表達式894.1運算符與表達式概述89
4.1.1C運算符簡介89
4.1.2C表達式簡介91
4.2算術運算符和算術表達式91
4.2.1算術運算符91
4.2.2算術表達式92
4.2.3算術表達式的例子93
4.3賦值運算符和賦值表達式93
4.3.1賦值運算符94
4.3.2賦值表達式94
4.3.3復合賦值運算符95
4.4增量減量運算符96
4.5子表達式的求值順序97
4.6數據類型的轉換99
4.6.1隱式類型轉換99
4.6.2賦值運算符兩側數據的類型轉換100
4.6.3強制類型轉換103
4.7逗號運算符和逗號表達式104
4.8本章小結105
習題4107
第5章分支結構1105.1關系運算符和關系表達式110
5.2邏輯運算符和邏輯表達式111
5.2.1邏輯運算符111
5.2.2邏輯表達式112
5.3條件運算符和條件表達式114
5.4C語句概述114
5.5if語句116
5.6switch語句119
5.7應用舉例122
5.8本章小結127
習題5128
第6章循環(huán)結構與程序設計基本算法1336.1循環(huán)結構與控制語句133
6.1.1while語句133
6.1.2for語句134
6.1.3dowhile語句136
6.1.4循環(huán)嵌套139
6.1.5流程控制語句(break語句、continue語句和goto語句)140
6.2控制循環(huán)的基本方法144
6.2.1通過計數器變量控制循環(huán)144
6.2.2通過程序執(zhí)行的狀態(tài)控制循環(huán)148
6.3窮舉算法153
6.4迭代與遞推算法157
6.4.1迭代157
6.4.2遞推159
6.5程序設計實例162
6.6編程實踐: 程序計時171
6.7本章小結172
習題6175
第7章函數與結構化程序設計1807.1函數180
7.1.1為什么要使用函數180
7.1.2函數定義183
7.1.3函數調用188
7.1.4函數原型與函數聲明190
7.1.5函數的執(zhí)行193
7.1.6主調函數與被調函數之間的數據傳遞195
7.1.7函數設計的思路198
7.2遞歸調用與遞歸算法202
7.2.1遞歸調用的執(zhí)行過程202
7.2.2遞歸算法204
7.2.3Hanoi塔問題206
7.3程序的函數分解208
7.4C程序結構217
7.4.1編譯預處理命令217
7.4.2全局聲明224
7.4.3函數225
7.4.4C程序的邏輯與物理構成225
7.5編程實踐: 軟件測試227
7.6本章小結229
習題7232
第8章指針與數組2368.1指針與指針變量237
8.1.1指針的概念237
8.1.2指針變量的聲明與初始化239
8.1.3指針的基本運算241
8.2數組的指針246
8.2.1一維數組的指針246
8.2.2二維數組251
8.2.3二維數組的元素指針和行指針256
8.2.4指向一維數組的指針變量(行指針變量)260
8.3字符指針與字符串262
8.3.1字符串處理函數262
8.3.2指向字符的指針變量處理字符串265
8.4指針作為函數參數267
8.4.1變量的指針作為函數參數267
8.4.2一維數組的指針作為函數參數270
8.4.3二維數組的指針作為函數參數273
8.5返回指針的函數275
8.6指針數組277
8.6.1指針數組的概念及其應用277
8.6.2指針數組作main函數的形參280
8.6.3行指針數組282
8.7編程實踐: 實用字符串處理284
8.8本章小結288
習題8297
第3章
數據類型與輸入輸出
學
習
目
標 了解C語言數據類型的分類。
掌握整型數據的內部表示、整型常量的表示、整型數據的輸出和輸入。
理解int、short和long 3種整型數據類型的區(qū)別。
掌握浮點常量的表示、浮點數的內部表示、浮點數的輸出和輸入。
理解float和double兩種數據類型的區(qū)別。
掌握字符型常量和變量的表示和聲明、字符型數據的內部表示、字符的輸出和輸入,掌握常見的字符處理技巧。
理解數組的內部表示,掌握數組元素的訪問和初始化。
理解如何表示字符串常量,如何用數組表示來存儲和處理字符串。
掌握字符串的輸出和輸入。
掌握如何向文本文件中輸入和輸出信息。
C語言是一種強類型語言,也就是說,所有的數據都是具有某種數據類型的,而且必須先聲明后使用。C語言提供的數據類型非常豐富,C語言除了提供整型、字符型和浮點型等基本數據類型外,還提供數組、結構體、共用體和指針等數據類型。利用這些數據類型能方便地描述較復雜的數據對象。
C語言的數據類型分類如圖3.1所示。
圖3.1C語言的數據類型分類
本章將介紹基本類型,其他類型將在后面章節(jié)介紹。C程序設計:方法與實踐第3章數據類型與輸入輸出3.1整型
整型是表示整數的數據類型。為了表示不同范圍的整數,C語言提供了豐富的整型類型,它們有的可以表示高達19位數的整數,有的只能表示5位數的整數;有的可以表示有符號數,如-23、-98,有的只能表示無符號的數,如1、917。
C語言中的整型類型可以總結成表3.1。其中括號內的內容可以省略。表3.1C語言整型類型
有符號型(默認)說明無 符 號 型說明(signed) int基本整型unsigned int無符號基本整型(signed) short (int)短整型unsigned short (int)無符號短整型(signed) long (int)長整型unsigned long (int)無符號長整型(signed) long long (int)unsigned long long (int)C整型類型分為有符號(signed)和無符號(unsigned)兩大類,分別表示有符號數和無符號數。對于有符號數,存儲單元的*高位用來存儲符號,0表示+,1表示-。對于無符號數,存儲單元中全部二進制位都用來表示值,而不包括符號。無符號型變量只能存放不帶符號的整數,如23、507等,而不能存放負數,如-23、-98。在默認情況下,整型是有符號的,如果要表示無符號整型,需要顯式地加上unsigned來限定。
C標準沒有具體規(guī)定以上各類數據所占內存字節(jié)數(也稱為寬度),各種平臺上有所不同,但是遵循以下原則: long型數據的字節(jié)數應不小于int型,short型不長于int型。例如,對于Win32平臺,在Visual Studio編譯系統(tǒng)中,各整型類型寬度和取值范圍如表3.2所示。在本書中,假定整型數據的規(guī)格(寬度、取值范圍)與表3.2保持一致。表3.2整型類型的規(guī)格
類型所占字節(jié)取 值 范 圍int4-2 147 483 648~2 147 483 647,即-231~231-1short2-32 768~32 767,即-215~215-1long4-2 147 483 648~2 147 483 647,即-231~231-1long long8-9 223 372 036 854 775 808~9 223 372 036 854 775 807,
即-263~263-1unsigned int40~4 294 967 295,即0~232-1unsigned short20~65 535,即0~216-1unsigned long40~4 294 967 295,即0~232-1unsigned long long80~18 446 744 073 709 551 615,即0~264-1long long和unsigned long long是在C99標準中引入的,目前主流的編譯器都支持,但是舊的編譯器可能不支持,如Visual C++ 6.0,Turbo C 2.0/3.0。具體到某一個平臺和編譯系統(tǒng),可以用sizeof()運算符來獲取某一種數據類型或變量的寬度。其用法是在括號中寫需要獲取寬度的類型名或變量名。例如:
printf("%d", sizeof(int));/輸出int型的寬度/
或者
int a;
printf("%d", sizeof(a));/輸出int型變量a的寬度/
都可以輸出int型的寬度。
3.1.1整數的內部表示
在計算機內部,數據都以二進制形式存在。那么整數在內存中是如何表示的呢?
無符號整數的表示比較簡單,直接采用整數的二進制表示。有符號數的*高位用于表示符號位,用0表示+,1表示負號。但是,剩余的二進制位并不是二進制表示。從原理上來說,有符號整數在內部采用補碼表示。對于一個數,計算機要使用一定的編碼方式進行存儲。原碼、反碼、補碼是機器存儲一個整數的編碼方式。
、 原碼。原碼就是符號位加上整數的絕對值,即用*位表示符號,其余位表示值。原碼是人腦*容易理解和計算的表示方式。
、 反碼。反碼的表示方法是: 正數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其余各個位取反。
、 補碼。補碼的表示方法是: 正數的補碼就是其本身;負數的補碼是在反碼的基礎上加1。
例如,如果用8位二進制表示整數,那么+1=(00000001)原碼=(00000001)反碼=(00000001)補碼
-1=(10000001)原碼=(11111110)反碼=(11111111)補碼圖3.2給出了幾個例子,其中左邊是高位,右邊是低位。圖3.2整數的內部表示示例
為什么int型整數可以表示-231呢?這要從引入補碼的原因說起。補碼有一個獨特的特征,即 a補碼+b補碼=(a+b)補碼。以8位二進制為例,
1補碼+(-1)補碼= 0 0000001+1 1111111=0 0000000=0補碼
8位二進制可以表示-128,可以認為這樣產生的:
(-128)補碼=(-1)補碼+(-127)補碼=1 1111111+1 0000001=1 0000000
3.1.2整型常量
整型常量即整型常數。C語言整型常數可用3種表示方式:
十進制整數。如124、234、-23、0等。
八進制整數。以0開頭的數是八進制數。如0234表示八進制數(234)8,它等于十進制數156。
十六進制整數。以0x或0X開頭的數是十六進制數。如0x234表示十六進制數(234)16,它等于十進制數564。注意,十六進制數只能由數字0~9和字母a~f(或A~F)組成。
當程序中出現整型常量時,如果它屬于int類型的取值范圍,那么編譯器會自動將它當作int型整數來處理,否則作為更寬的數據類型來處理。為了顯式地要求編譯器把一個常量作為long型處理,可以在后面加一個字母L(或l),如30L、05647L、0x8abfl。為了指明是無符號常量,可以在后面加上字母U(或u),如30U、05647U、0x8abfu。還可以同時加上U和L表示無符號長整型,如30LU、05647LU、0x8abfLU。
3.1.3整數的輸出
整數用printf進行格式化輸出。printf函數的一般調用格式為: printf(格式化字符串, 輸出參數列表);
其中,格式化字符串是用雙引號括起來的字符串,它包括兩種信息:
、 格式說明,由%和格式字符組成,如%d、%f等。它的作用是將輸出的對象采用指定的格式輸出。格式說明總是由%字符開始的。
② 普通字符,即需要原樣輸出的字符,它可以是一般字符,也可以是轉義字符。
在用printf函數輸出一個整數時,要考慮兩個因素: 整數的類型(int、short、long還是long long)和以什么形式輸出(什么進制,有符號還是無符號)。
可用的格式控制符如表3.3所示,它們分為兩組,一組指示以什么形式輸出,另一組告訴printf函數該數據是什么類型。這些格式控制符的組合如表3.4所示。表3.3printf格式字符
作用格式字符(%)說明輸出形式d以帶符號的十進制形式輸出整數(正數不輸出符號)o以無符號八進制形式輸出整數(不輸出前導符0)x以無符號十六進制形式輸出整數(不輸出前導符0x)u以無符號十進制形式輸出整數數據類型h用于短整型l用于長整型ll用于long long類型表3.4printf格式字符的組合
數據類型輸 出 形 式duox十進制形式
輸出int無符號十進制形式
輸出unsigned int無符號八進制形式
輸出unsigned int無符號十六進制形式
輸出unsigned inth十進制形式
輸出short無符號十進制形式
輸出unsigned short無符號八進制形式
輸出unsigned short無符號十六進制形式
輸出unsigned shortl十進制形式
輸出long無符號十進制形式
輸出unsigned long無符號八進制形式
輸出unsigned long無符號十六進制形式
輸出unsigned longll十進制形式
輸出long long無符號十進制形式
輸出unsigned long long無符號八進制形式
輸出unsigned long long無符號十六進制形式
輸出unsigned long long說明:
① 在選擇格式控制符的時候,要根據原本的數據類型和期望的輸出形式(十進制、八進制還是十六進制)來確定,尤其是數據類型說明符(h、l、ll)。
、 這些格式控制符只是指示printf函數如何解讀、輸出整數值,不會影響整數值原本的數據類型和存儲形式。
、 同一個值用不同的格式控制符輸出的時候,結果不同,不是值發(fā)生了變化,而是對值的解讀不同。
④ 用u、o和x格式控制符的時候,將數據解讀為無符號數,本應用于輸出無符號數,但是也可以用于有符號數,前提是這種解讀不會造成曲解。C語言中任何數據都屬于某種數據類型,而且任何一個值的數據類型編譯系統(tǒng)都是知道的,那么printf函數的格式化字符串中為什么還要有h、l、ll這些與數據類型相關的格式控制字符呢?其實,這些格式控制字符只是告訴系統(tǒng)如何來看待后面的值,也就是說,同一個值可以“當作”不同類型的值來輸出。例3.1整型數據的格式化輸出。
1#include
2int main() {
3 int a_int=2, b_int=-2;
4 unsigned int c_uint=4294967293;
5 short d_short=2;
6 long e_long=4294967294;
8 printf("a_int: %d, %u, %o, %x\\n", a_int, a_int, a_int, a_int);
9/a_int: 2, 2, 2, 2/
10 printf("b_int: %d, %u, %o, %x\\n", b_int, b_int, b_int, b_int);
11/b_int: -2, 4294967294, 37777777776, fffffffe/
12 printf("a_int: %ld, %lu, %lo, %lx\\n", a_int, a_int, a_int, a_int);
13/a_int: 2, 2, 2, 2/
14 printf("c_uint: %d, %u\\n", c_uint, c_uint);
15/c_uint: -3, 4294967293/
16 printf("d_short: %d, %u\\n", d_short, d_short);
17/d_short: 2, 2/
18 printf("d_short: %hd, %hu\\n", d_short, d_short);
19/d_short: 2, 2/
20 printf("e_long: %hd, %hu\\n", e_long, e_long);
21/e_long: -2, 65534/
22 return 0;
23}
為了方便對照,每一個printf語句的輸出結果顯示在下一行的注釋中。
對比變量的原始值,可以分析如下:
第8行變量a_int用%u、%o和%x 3種格式符輸出的時候沒有錯誤,雖然這3種格式本用來輸出無符號數。這是因為a_int為正數,以無符號數來解讀其內部表示的時候值不變。
第10行變量b_int用%u、%o和%x 3種格式符輸出的時候出現錯誤,因為b_int為有符號數,以無符號數來解讀其內部表示的時候得到的是不同的值。
第12行將變量a_int以長整型的形式輸出,結果沒有問題,因為在Win32平臺上int和long兩個數據類型是完全相同的。
第14行變量c_uint用%d格式符輸出的時候出現問題,因為%d格式符是按有符號數輸出,而c_uint的*高為1,被解讀為一個負數。
第16行變量d_short用%d和%u輸出的時候沒有錯誤。這是因為short型數據會被自動提升為int型。實際上,對于short型數據,既可以用%d、%u也可以用%hd和%hu來輸出。
第20行變量e_long用%hd和%hu輸出的時候存在問題,因為它被當作short類型(2B)來解讀,也就是說,只會考察低位的兩個字節(jié),這兩個字節(jié)的內容按照有符號數來解讀是-2,按照無符號數來解讀是65534。
上面所用的格式符都是按數據的實際長度輸出,為了輸出排列的需要,有時要指定每一個數據的輸出寬度和對齊方式。指定輸出寬度和對齊方式需用到兩個附加格式符m和-。附加格式符放在%和格式符之間使用。
m為一正整數,用來指定輸出寬度,如果數據的實際寬度比指定輸出寬度小,則補上空格后按指定寬度輸出;如果數據的實際寬度比指定輸出寬度大,則按實際寬度輸出。
附加格式符“-”用來說明采用左對齊方式,沒有“-”時默認是右對齊方式。
例3.2整型數據按照指定寬度和對齊方式輸出。
1#include
2int main(){
3int a=4, b=45, c=456, d=4567;
4unsigned u=456;
5long l=456;
6printf("a=%3d, b=%3d, c=%3d, d=%3d\\n", a, b, c, d);
7/a=4, b=45, c=456, d=4567/
8printf("a=%-3d, b=%-3d, c=%-3d, d=%-3d\\n", a, b, c, d);
9/a=4, b=45 , c=456, d=4567/
10printf("u=%-5u, u=%5u, l=%-5ld, l=%5ld\\n", u, u, l, l);
11/u=456, u=456, l=456, l=456/
12return 0;
13}
其中,每一個printf語句的輸出結果顯示在下一行的注釋中。
3.1.4整數的輸入
可以用scanf函數來輸入數據給整型變量;貞浺幌拢瑂canf函數調用的一般形式為: scanf(格式化字符串, 地址列表);
其中,格式化字符串的含義同printf函數類似,地址列表是由若干個地址組成的列表,可以是變量的地址,或字符串的首地址。
在介紹更多的例子之前,先介紹scanf函數的原理。
scanf函數以及其他的標準輸入函數并不是直接從輸入設備(如鍵盤)讀取數據,而是從內存中的輸入緩沖區(qū)中讀取數據。如果scanf函數要讀取數據,而內存緩沖區(qū)為空,scanf函數就會被阻塞,等待用戶輸入。用戶輸入數據并按回車鍵后,所輸入的內容才送到內存輸入緩沖區(qū)中。
scanf函數的*個參數格式化字符串指示了如何從輸入緩沖區(qū)中讀取數據。格式化字符串中可以包含以下內容:
格式化字符,由%引導的字符。格式化字符導致scanf讀入若干字符并將其轉換為某種類型的數據,該數據會被存入到地址列表中的某一地址。
除%外的非空白字符。一個非空白字符導致scanf讀入一個相同的字符但并不存儲該字符。如果scanf讀不到一個相同的字符,scanf會中斷。
空白字符,包括空格、跳格('\\t')和換行符('\\n')。一個空白字符導致scanf讀入后面連續(xù)的空白符,直到下一個非空白符。
scanf使用的具體格式符與printf中類似,如表3.5所示。表3.5scanf整數輸入格式符
作用格式字符(%)說明輸入形式d期望讀入一個十進制數o期望讀入一個八進制數x期望讀入一個十六進制數u期望讀入一個無符號數數據類型h期望讀入一個 short型數據l期望讀入一個long型數據ll期望讀入一個long long型數據附加格式符m(正整數)指定輸入數據所占的寬度(列數)表示本輸入項在讀入后不賦給相應的變量下面是scanf在使用時需要注意的幾個地方。
(1) 輸入數據的格式注意要與scanf格式化字符串的格式一致。例如:
……
你還可能感興趣
我要評論
|