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