![C和指針第二版_第1頁(yè)](http://file4.renrendoc.com/view/a6474c643faf3ea5ef6365ab432ffbd4/a6474c643faf3ea5ef6365ab432ffbd41.gif)
![C和指針第二版_第2頁(yè)](http://file4.renrendoc.com/view/a6474c643faf3ea5ef6365ab432ffbd4/a6474c643faf3ea5ef6365ab432ffbd42.gif)
![C和指針第二版_第3頁(yè)](http://file4.renrendoc.com/view/a6474c643faf3ea5ef6365ab432ffbd4/a6474c643faf3ea5ef6365ab432ffbd43.gif)
![C和指針第二版_第4頁(yè)](http://file4.renrendoc.com/view/a6474c643faf3ea5ef6365ab432ffbd4/a6474c643faf3ea5ef6365ab432ffbd44.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
為什么需要這本書市面上已姫冇了許多優(yōu)秀的講述C語(yǔ)さ的書籍.為什么我們還需要這一本呢?我在大學(xué)里.教授C語(yǔ)言編程已有10個(gè)年頭,但至今尚未發(fā)現(xiàn)本書是按照我所喜歡的方式來講述指針的。許多書籍用一章的篇幅專門講述指針,而[!往往出現(xiàn)在全書的后半部分。但是,僅僅描述指針的語(yǔ)法、并用一些簡(jiǎn)單的例子展示其用法是遠(yuǎn)遠(yuǎn)不駱的。我在授課時(shí),很早便開始講授指針,而且在以后的授課過程中也經(jīng)常討論指針.我描述它們?cè)诟鞣N不同的上下文環(huán)境中的有效用法,展示使用指針的編程慣用法(programmingidiom)。我還討論了一些相關(guān)的課題如編程效率和程序可維護(hù)性之間的權(quán)衡。指針是本用的線索所在,融會(huì)貫通「全書之中.指針為什么如此重要?我的信念是:正是指針使C威力無(wú)カ.有些任務(wù)用其他語(yǔ)言也可以實(shí)現(xiàn),但C能夠更有效地實(shí)現(xiàn):有些任務(wù)無(wú)法用其他語(yǔ)占實(shí)現(xiàn),如直接訪問硬件,但C卻可以。要想成為一名優(yōu)秀的C程序員,對(duì)指針有一個(gè)深入而完整的理解是先決條件.然而,指針雖然很強(qiáng)大,與之相伴的風(fēng)險(xiǎn)卻也不小。跟指甲鋅相比,錘鋸可以更快地切割木材,但就鋸更容易使你受飭,而且傷宙常常來得極快,后果也非常嚴(yán)重。指針就像鏈裾ー樣,如果使用得當(dāng),它們可以簡(jiǎn)化算法的實(shí)現(xiàn),并使其?更富效率:如果使用不當(dāng),它們就會(huì)引起錯(cuò)誤,導(dǎo)致細(xì)微而令人閑惑的癥狀,并且極難發(fā)現(xiàn)原因。對(duì)指針只是略知一:?便放手使用是件非常危險(xiǎn)的事。如果那樣的話,它給你帶來的總是痛苦而不是歡樂.本書提供了你所需要的深入而完整的關(guān)于?指針的知識(shí),足以使你避開指針可能帶來的痛苦。為什么要學(xué)習(xí)C語(yǔ)言為什么C語(yǔ)言依然如此流行?歷史上,由于種種原因,業(yè)界選擇了C,其中最主要的原因就在于它的效率.優(yōu)秀C程序的效率幾乎和匯編語(yǔ)言程序一樣高,但C程序明我比匯編語(yǔ)言程序更易于開發(fā)?和許多其他語(yǔ)言相比,C給予程序員更多的控制權(quán),如控制數(shù)據(jù)的存儲(chǔ)位置和初始化過程等。C缺乏“安全網(wǎng)”特性,這雖有助于提髙它的效率,但也増加了出錯(cuò)的可能性.例如,C對(duì)數(shù)組下標(biāo)引用和指針訪問并不進(jìn)行有效性檢査,這可以節(jié)省時(shí)間,但你在使用這些特性時(shí)就必須特別小心?如果你在使用C語(yǔ)言時(shí)能夠嚴(yán)格遵守相關(guān)規(guī)定,就可以避免這些潛在的問題.C提供了豐富的操作符集合,它們可以讓程序員有效地執(zhí)行一些底層的計(jì)算如移位和屏蔽等,而不必求助匯編語(yǔ)言.C的這個(gè)特點(diǎn)使很多人把C稱為“髙層”的匯編語(yǔ)言.但是,當(dāng)需要的時(shí)候,C程序可以很方便地提供匯編語(yǔ)さ的接口.這線特性使C成為實(shí)現(xiàn)操作系統(tǒng)和嵌入性控制器軟件的良好選擇.C流行的另ー個(gè)原因是由于?它的普遍存在.C編譯器在許多機(jī)器上實(shí)現(xiàn).另外,ANSI標(biāo)準(zhǔn)提髙了C程序在不同機(jī)器之間的可移植性?最后,C是CH的基礎(chǔ).CH提供了種和C不同的程序設(shè)計(jì)和實(shí)現(xiàn)的觀點(diǎn).然而,如果你對(duì)C的知識(shí)和技巧,如指針和標(biāo)準(zhǔn)庫(kù)等成竹在胸,將非常有助于你成為一名優(yōu)秀的cr程序G?為什么應(yīng)該閱讀這本書本書并不是一本關(guān)于編程的入門圖書.它所面向的讀者應(yīng)該已經(jīng)具備了一?些編程經(jīng)驗(yàn),或者是一些想學(xué)習(xí)C,但乂不想被諸如為什么循環(huán)很重要以及何時(shí)需要使用if語(yǔ)句等膚淺問題耽誤進(jìn)程的人.另一方面,我并不要求本書的讀者以的學(xué)習(xí)過C。我講述了C語(yǔ)キ所有方面的內(nèi)容。這種內(nèi)容的廣泛覆證性使本書不僅適用于學(xué)生,也適用于專業(yè)人員。也就是說,適用于首次與習(xí)C的讀者和那些經(jīng)驗(yàn)更ピ富的希望進(jìn)ー步提髙語(yǔ)言使用技巧的用戶.優(yōu)秀的CH書籍把精力集中于與面向?qū)ο竽P陀嘘P(guān)的課題上(如類的設(shè)計(jì))而不是專注于基本的C技巧,這樣做是對(duì)的.但C1是建立在C的基礎(chǔ)之上的,C的基本技巧依然非常境要,特別是那些能弊實(shí)現(xiàn)可復(fù)用類的技巧。誠(chéng)然,C卄程序員在閱讀本書時(shí)可以跳過?些他們所熟悉的內(nèi)容,但他們會(huì)在本書中找到許多有用的C工具和技巧。本書的組織形式本書按照教程的形式組織?它所面向的讀者是先前具有編程經(jīng)驗(yàn)的人?它的編寫風(fēng)格類似于導(dǎo)師在你的身后注視著你的工作,不時(shí)給你ー些提示和忠告.我的目標(biāo)是把通常需要多年實(shí)踐才能獲得的知識(shí)和觀點(diǎn)傳授給讀者.這種組織形式也影響到材料的順序ー我通常在一個(gè)地方引入ー個(gè)話題,并進(jìn)行完整的講解?因此,本節(jié)也可以當(dāng)做參考手冊(cè).在這種組織形式中,存在兩個(gè)顯著的例外之處?首先是指針,它貫穿全書,將在許多不同的上下文環(huán)境中進(jìn)行討論.其次就是第I章.它対語(yǔ)言的基礎(chǔ)知識(shí)提供r-個(gè)快速的介紹.這種介紹有助于你很快掌握編寫筒単程序的技巧?第1章所涉及的主題將在后續(xù)章節(jié)中深入講解.較之其他書籍.本歸在許多領(lǐng)域著墨更多.主要是為了讓每個(gè)主題更具深度,向讀者傳授通常只有實(shí)踐才能獲得的經(jīng)驗(yàn)?另外,我使用了一些在現(xiàn)實(shí)編程中不太常見的例子,雖然有些不太容易理解,但這些例子顯示了c在某些方面的趣味所在.ANSIC本書描述ANSIC,是由ANSI/ISO9899-1990[ANSI90J進(jìn)行定義并由(KERN89]進(jìn)行描述的.我之所以選擇這個(gè)版本的C是基于兩個(gè)原因:首先,它是舊式C(有時(shí)稱做Kernighan和Ritchie[KERN78],或稱K&R〇的后繼者,并已在根本ヒ取代了后者:其次,ANSIC是C++的基礎(chǔ).本書中的所有例子都是用ANSIC編寫的?我常常把"ANSIC標(biāo)準(zhǔn)文檔”簡(jiǎn)稱為“標(biāo)準(zhǔn)”.排版說明語(yǔ)法描述格式如下if(expression)statement?Ise我在語(yǔ)法描述中使用了4種ア體,其中必需的代碼(如此例中的美鍵字if)將如上所示設(shè)置為CourierNew字體,必要代碼的抽象描述(如上例中的expression)用CourierNew表示.有些語(yǔ)句具有可選部分,如果我決定使用可選部分(如此例中的?ー。關(guān)鍵字),它將嚴(yán)格按上面的例子以粗體Ccrnz:?N??衰示?可選部分的抽象描述(如第2個(gè)statement)將以相聊於CotiriorNeザ表示?每次引入新術(shù)語(yǔ)時(shí),我將以黒體表示.完整的程序?qū)?biāo)上號(hào)碼,以“程序。.げ這樣的格式顯示.標(biāo)題給出了程序的名稱,包C和理色含源代碼的文件名則顯示在右下角——這些文件都可以從AddisonWesleyLongman的網(wǎng)站上找到?文中有“提示”部分.這些提示中的許多內(nèi)容都是對(duì)良好編程技巧的討論一就是使程序更易編寫、更易閱讀并在以后更易理解。當(dāng)一個(gè)程序初次寫成時(shí),稍微多做些努力就可能節(jié)約以后修改程序的大量時(shí)間.其他ー些提示能幫助你把代碼寫得更加緊湊或更有效率。另外還有一些提示涉及軟件工程的話題號(hào)c的誕生遠(yuǎn)早r現(xiàn)代軟件工程原則的形成。因此,有些語(yǔ)言特性和通用技巧不為這些原則所提倡.這些話題通常涉及到某種特定結(jié)構(gòu)的效率和代碼的可讀件與可維護(hù)性之間的利弊權(quán)衡。這方面的討論將向你提供一些背景知識(shí).幫助你判斷效率上的收益是否抵得上其他質(zhì)量上的損失.當(dāng)你看到“警告”時(shí)就要特別小心:我將要指出的是c程序員新手(有時(shí)延至是老手)經(jīng)常出現(xiàn)的錯(cuò)誤之、或者代碼將不會(huì)如你所預(yù)想的那樣運(yùn)行。這個(gè)警告標(biāo)志將使提示內(nèi)容不易被忘記,而且以后回過頭來尋找也更容易?些?!癒&RC”表示我正在討論ANSIC和K&RC之間的重要區(qū)別。盡管絕大多數(shù)以K&RC寫成的程序僅需極微小的修改即可在ANSIC環(huán)境運(yùn)行,但有時(shí)你仍可能碰到ー個(gè)ANS】之前的編譯器,或者遇到ー個(gè)更老式的程序。如此來,兩者的區(qū)別使至關(guān)重要.毎章問題和編程練習(xí)本書每韋的最后ー節(jié)是問題和編程練習(xí),問題難簡(jiǎn)不ー,從簡(jiǎn)單的語(yǔ)法問題到更為復(fù)雜的問題諸如效率和可維護(hù)性之間的權(quán)衡等.編程練習(xí)按等級(jí)區(qū)分難度:十的練習(xí)最為簡(jiǎn)單,★★★★★的練習(xí)難度最大。這些練習(xí)有許多作為課堂測(cè)驗(yàn)己沿用多年。問題或編程練習(xí)前如果有個(gè)メ符號(hào),表示在附錄中可以找到它的參考答案.補(bǔ)充材料AddisonWesleyLongman專門為本書維護(hù)了一個(gè)WorldWideWeb站點(diǎn)。該站點(diǎn)的URL是/cscng/titles/0-673-99986-6/(或可直接訪問作力主頁(yè)www.cs.riLcdu/kar/).這個(gè)站點(diǎn)包含本書所有程序的源代碼,以章為単位分類。你還可以在上面看到本書的最新勘誤表。你還可以聯(lián)系附近的AddisonWesleyLongman代表,獲取/nstructorsGuide.它包含了書上未給出答案的問題和編程練習(xí)的所有答案。如果你是一位教育工作者,也可以免費(fèi)獲取UNIX系統(tǒng)上自動(dòng)遞交和測(cè)試學(xué)生程序的軟件[REEK89,REEK96レ通過匿名FTP:?冃錄是pub/kar/try。前方致謝我無(wú)法列出所有對(duì)本書做出貢獻(xiàn)的人們,但我將將謝他們中的所有人.我的妻子Margaret對(duì)我的ワ作鼓勵(lì)有加,為我提供精神上的支持,而且她默默承受著由于我寫作本曲而帯給她的生活上的孤獨(dú).我要感謝WarrenCaithers教授,他是我在R1T的同事,閱讀并審校了本書的初稿。他真誠(chéng)的批評(píng)徳助我從一大堆講課稿和例ア中生成了?份清晰、連貫的手稿.我非常感謝我的C語(yǔ)キ編程課程的學(xué)生們,他們幫助我發(fā)現(xiàn)錄入錯(cuò)誤,提出改進(jìn)意見,并在教學(xué)過程中忍受著草稿形式的教材.他們對(duì)我的作品的反應(yīng)向我提供了有益的反饋,幫助我進(jìn)ー步改進(jìn)本書的質(zhì)量.我還要感謝SteveAllan,BillAppelbe,RichardC.Detmcr,RogerEggen,JoanneGoldenberg,DanHinton,DanHirschbcrg,KeithEJolly,Josq)hF.Kent,MasoudMilani,SteveSummit和KanupriyaTewary,他們?cè)诒緯霭媲皩?duì)它作了評(píng)價(jià)。他們的建議和觀點(diǎn)對(duì)我進(jìn)ー步改進(jìn)本書的表達(dá)形式助益頗多.最后,我要向我在Addison-Wesley的編輯DeborahLaflerty女士、產(chǎn)品編輯AmyWiHcutt女士表示感謝.正是由于她們的幫助,オ使這本節(jié)從一本手稿成為一本正式的書爲(wèi)。她們不僅給了我很多有價(jià)值的建議,而!!鼓勵(lì)我改進(jìn)我原先自我感覺良好的排版.現(xiàn)在我已經(jīng)看到了結(jié)果,她們的意見是正確的?現(xiàn)在是開始學(xué)習(xí)的時(shí)候了,我預(yù)祝大家在學(xué)習(xí)C語(yǔ)言的過程中找到快樂!KennethA.Reckkar@Churchville.紐約
快速上手.1空白和注餐 吟 mainMt -4readcolumnnunbosA<t,l.Uivanange補(bǔ)充說明 鹹 警吿的總結(jié) 第芹叫曜ケ報(bào)]怠jfcfe. : 礴 112執(zhí)行 字符 222ii# 123y由形式的源代陽(yáng) 2s 的影式??ー?ーー?ーーーー 第1章1.112131.4IS161.7IE第2童2.122232.4 26262728292929323335355636373838お26262728292929323335355636373838お-40-414141-41-43屮怨-46-4747-48-515151父5253545455562,5班的總結(jié) 26 總結(jié) 2.7問題 ーー第3章!MT- 3.1基本岫g類型 .1整型社 浄點(diǎn)突型ー W ?-32基本聲明?一 32.1初始化ー 322戶明簡(jiǎn)單數(shù)組 323聲WHb 32.4隱式メ明- 33typedef 3.4常量- 35作用城 代聯(lián)作用安 352文科用城 353原型作用域 354函?作用縊一 翎專觸性 不褥煙 static關(guān)畔- 作用域、存儲(chǔ)知示鈾 斉- 警吿的總結(jié)“?一 雌醍示的總結(jié) 問題 第4章耐 一4.1空語(yǔ)句 42 がト 43代碼決 4.4if語(yǔ)甸ー…“…ーーー43while飽 break和continue語(yǔ)句 4.52while語(yǔ)句for眄 do語(yǔ)句 -
4.8switch 一 …“”…"一一?57481swiich中的break語(yǔ)句 " 584.82defeult子句 - 594.9grto語(yǔ)句 604.10J&8 - -61TOC\o"1-5"\h\z4.12 —— 一-62\o"CurrentDocument"4.13問題 624.14 63第5章刪俯和?^ 675.1第"i 675.1.1 算^Mi!苻 675.12 符 675.13 411m5 695.1.4 %W 705.15單冃符 - 725.1ん 關(guān)樂*It杼 735.1.7建?隘作符 745.1.9 逗號(hào)?n符 76§1[0卜"弓[ヽ 周六1チ,會(huì)上 1…""""<?1*—****"-’7’752535.4布爾值ー— ね左值被值 - 79 — 805.4.I穩(wěn)式類型田 80JM琳捷 80研符的屬也 814優(yōu)電級(jí)和求值的*4 宀 82555.65.7535.9總結(jié) —ーー85亜體慮結(jié) - 86ヾ的總結(jié) 86問題 86第6章指針 916.162636.4內(nèi)#WtStt — 91 92礴怖 94
未初始化相能的撒1?…NULし刪ー 指針、間接訪問和左值ー指針、間接訪問和變量…指針存量—————械加b— 肺求達(dá)式ー 實(shí)例?——一指針運(yùn)算- 3.1算術(shù)運(yùn)算 n關(guān)系運(yùn)算 總結(jié) - 警告的總結(jié) 編嘅示的總結(jié) 間£ 第フ章函數(shù) 函數(shù)定義 12曲如明 721原型 722函數(shù)的缺省認(rèn)定73函數(shù)的參數(shù)……?……”…ADT和黑盒 幽ーー 751速蹤通歸函數(shù)一152遞歸身遺代?■可變耕好欣 .1sldarg宏 可變糠的限制總結(jié) 警告的總結(jié)-“i?^,而強(qiáng) 問題 ——第8章數(shù)組 F蝴 .14m 下標(biāo)引用 ?95%-97-97%989920708101112121215?95%-97-97%989920708101112121215I7l719192122242728131343535%ml3713813844144TOC\o"1-5"\h\z4m2M旨針 150&16作カ?MtMt的4mx 1507聲明物"<? ??- 152&19不克整的初坳匕 15310自期十算圖よMt - 15311字 匕 - 15382多維數(shù)組 - 154154822 155823下標(biāo)ー - 156指向皿的オHt 158825作為事數(shù)豪數(shù)的お雉做姐 15982^ 160紙蛆長(zhǎng)度自動(dòng)計(jì)算 16283 例雖 162\o"CurrentDocument"8.4 總結(jié) 16585警吿的總站ーー 1668.6物蟻示的總結(jié) 1668.7問題ー — 16686 - 170第9章 鐘串、鈉語(yǔ)節(jié) 1759.1的串^ -I7592字符申長(zhǎng)度 17593不SRffl便的串褪 17793.1復(fù)制字符率 - 177932連特杼* t 178933口的返図值 - 17893.4ギ符料※ 1789.40串緘 17995字符串査觸礎(chǔ) —- - 18095.1疊找ー個(gè)字符 180952 キ符 181953麥提ー個(gè)子? 18196髙級(jí),冽申?yáng)苏?1829?62 1829.7錯(cuò)膾息 184C和指針9.8 184.I字符分類 184ユ字符?裝 - 184內(nèi)存操作 185産 186?告的總結(jié) 187⑻問題 - 188188第10章 結(jié)構(gòu)和聯(lián)合 19510.1 19510.1.1結(jié)構(gòu)聲明 195in10よ制 一…… K9E膽?貝 ,r. a”… 19710.13結(jié)構(gòu)成員的直接訪問 - 19710.1.4結(jié)構(gòu)成員的間接訪問 , 198in1<網(wǎng) 一…… IU.1O 198in1工丈 禽皿,… IU.I4)小Aj霍0I尸?FFFEr ""■" 一,一,,, 199ini7必# …宀.“.*—…—…— 一一IU*J" 1W102結(jié)構(gòu)、扌融成員 200甘係攝jキ.— — - IU/J 2U1?爾??一 一- 一—―IU// 2UI102.3訪問結(jié)構(gòu)成員 202102.4訪問我的結(jié)構(gòu) - 20310J5訪問扌魯4+成員 204伙 _ 一— llAJWuTfFW7/RL ”… ……一….?-205侏由ヨSfrleJKMir:Ml—“一1- 一 .1U.417K團(tuán)見i費(fèi)覽(H*na …—— 宀* 206/占船…,1虱.皮 2091U.O4a.rj 211tnx1*&し"岳 — —.一…IU.O.1大/即73L 'r,r "" ZI2mx尋ムMlrrHiiイレ… 一 一 ーーlu.Ox ","","21310.7總結(jié)ー— - -………——>--?… 21410.8?吉小 ”"“一?… 214TOC\o"1-5"\h\z結(jié) 214MJS - :??一215217第11章 動(dòng)態(tài)內(nèi)存5HE 221H.l MF么觸動(dòng)態(tài)內(nèi)存懈 221112 malloc和曲ar 221II3 calloc和rcalioc—— -?——_?-―一一ス22目棗TOC\o"1-5"\h\z使用動(dòng)態(tài)分配的內(nèi)存 - ——223113 - 2231U內(nèi)存分?實(shí)例 226 231心警吿的總結(jié) - 232232問題 232習(xí) - 233第12章 使用結(jié)構(gòu)和指H -2351Z1 ———?——— - 235122単鏈表 2351221 中ハ -2361222 *??-245123雙鏈表 一 245123.1在中拈入 24612.4總結(jié)- - - 253125警告的總勢(shì) - 254126 ー- 254127証麗- 2543編陶日 ーー -? 255第13章松題一一 二 257111進(jìn)告探討指向指針的指針 —— 257132髙級(jí)聲明 --——258133南!Wm - 260133.1回調(diào)函效 一一一一- 2611332的表 26313.4 - - 2654.1傳遞?荘 265處理命^ ?一 266135 的串IMb 2的13f産- - 27113.7 夠的總細(xì) 27213.8 272139問摩…" - -27213.10硬辨3?—— - - ———275第14章預(yù)處理器 279144 -- - —-2791421宏 ーー 2814.22Wdefinc^M- * -2824.23宏與^t - 283常副作用的: -?--284命名約定 ― - ——285#undef 2851427命令行定義 - 285糾1^洋 - 2 286143.j是否被定義 - 2871432嵌和衿 288文他含 - -2881441 文件姐 - *289件包^ —— 289盛套文件バ ---—290總結(jié) - —ー?一292警吿的總結(jié) 一 ———293148 - -29314.10蹄額 -295第15章施》出函數(shù) —————29715415215315.4節(jié)雕吿 - -297紿忸行 - 298ANSILO*…??皿 -~- -299J冊(cè) * -砂文件 *-300郴隹火)常量 - 30015515615.715s流VO總覽 ?一ー 301打開流ー 302關(guān)閉流.一 303的PO -—-30415X!字符!/□農(nóng) - 30515.82牴銷字符I0 - 30515.9未格式化的行!A>—?- 一——30615.10格式四行LO 30815.10.1scanf趣 30815.102scaif格式代碼 --—308TOC\o"1-5"\h\zprirtf標(biāo) 3124primf格式代円 312二迸制!O 316流錯(cuò)誤函數(shù) 319319文竹操縱函數(shù) 319蠅 320茉程提示需總結(jié) 3221520Mtt 3221521 323第16注標(biāo)準(zhǔn)函數(shù)庫(kù) 327算術(shù)<sadlibh> 327ftlM4t<aidKbJ? 328字符串樣換ぐ 329浮歯數(shù) 329三角Mt 3301622雙曲函數(shù)<malhh> : 3301623 メ他MB較Aft 330浮點(diǎn)?べえ<madLh> 3312.6尺UBし、管副し、^^^伍ネ贈(zèng)そ^?CnnAh>** 一一_.一...——ーーaス]キ將串キ橫<stdlibJi> 332H娜時(shí)間函數(shù) 3321632多天時(shí)間<tmeh> 33216.4 (沫oegmpJp** 3354.1實(shí)倒 336イ哂イ非 337信號(hào)名<80Mib> 3381632處理信號(hào)"ih> - 3391653信號(hào)*tMAM 340打卬可變參數(shù)列表3tag2 341執(zhí)行環(huán)境 34216し7.1玲 34216.72斷音 - 34216.73 壞境<8(冊(cè)2 34316.7.4 執(zhí)行系統(tǒng)命令yffibh> 34316.73 排序和查找<s(&bh> 344bode 34616X1敕值和貨幣格式 : 346168ユキ符.和!ocale<stringJV> ……- ーーー34816.8.3改變locale的iiJIL 349 349\o"CurrentDocument"警告的總結(jié)- 350的 - - 351福 宀 - 351編程練習(xí) - - ——— 352第17章經(jīng)蜘象類型 355內(nèi)存分配. 355W - 宀 - - 355ロ, - 3561722 實(shí) 356MJ0 364隊(duì)ア依。 - 3641732 實(shí)ベ列 36517.4樹 —- - * 3691741N叉拽索樹中れ — 3702索樹?節(jié)點(diǎn)- 370仁Ot索樹中查找 - 371樹^^ い 3715二JUt索梅口 - 3726實(shí)バ5U<京樹” - 373173 *?一 379短過f的マ - 3791752?經(jīng)過f的類型 3801753名字沖実 380標(biāo)準(zhǔn)あ就庫(kù)的ADT 38117田産 — 383他的函 - 3ヨ結(jié) - 384179向鑑 384\o"CurrentDocument" 385第18堂運(yùn)行時(shí)環(huán)境 —— ーー -—— 387
io1 ..ー" 一一一- 一……. 宀“… 10.1 J**J■*rIT5e?Q110心寶Mxfc..-—— lo.I.liq1n ***^*^"?*4?オレ???I.——— ----,. —.— ””\on18」ユ方密塞,更小卻び?4匕111' 1 JVU14113JMNL* - -- lo.l3軍利網(wǎng) 1 1","11 1 1jyi1Q1jt至Ji9¢赤-4-……“……― L-LFE15.1.4サ仔弄芟立 .,,..,■■,“,“,,,,ハ,…,?一 十ー,1Q1£ 立丘* ……….一一10.12)ガk刊"旳?スiq1<飴冊(cè)…. “一 …一? 1O.1.D刊5軍?1區(qū)演布同101rJl:**MSME?ーー一一一…… , 一一一一( ….…―ーー 18.1.7本的M拝冏 J7Q ーーー 一 レE5IFロUgfj ”ア丄2 9JHヨルケ to/ —…—-エ——…….”.…—….…… ..”..”.”“一….”一,-一… .一一Am18.4愿56?A*■,レハM處_ ___ _ AM1OJ,ロ RJよ ニュ/?Mル士 一一--ーーー.ーーーーーーーー. ? ーーーI .AM16Q ソ國(guó) iq<7爲(wèi)1ffii 一.一一一—宀”.?—-18-/lnJ?l 18.8卿宜加d *ヨ如厶 ,一一 __ ?一 A4Vt冏[率 口,ノ 不 RJ*n1 ーーーー….一.一 一 a? 二mil ▼*フ——— 快速上手1.I簡(jiǎn)介從頭開始介紹ー門珀程語(yǔ)言總是出得很困嚏,因?yàn)橛性S多細(xì)埼還沒有介紹,很磅讓讀者在頭腦中形成一幅完帔的圖.在本章中,我將向大家展示個(gè)例子程序,并逐行講解它的工作過程,試圖止大家對(duì)C語(yǔ)言的整體有一個(gè)大概的卬家?這個(gè)例子程序同時(shí)向你展示了你所熟悉的過程在C語(yǔ)言中是如何實(shí)現(xiàn)的。這些信息再加上本章所討論的其他上牌,向你介紹rc誦キ的基礎(chǔ)知識(shí).這樣你就可以自己編寫有用的C程序了.我們所要分析的這個(gè)程序從標(biāo)準(zhǔn)施入讀取文本并對(duì)其進(jìn)行修改,然后把它寫到標(biāo)準(zhǔn)輸出?程序1.1苜先讀取ー申列標(biāo)號(hào).這些列標(biāo)號(hào)成對(duì)出現(xiàn),式小輸入行的列越圍.這串列標(biāo)號(hào)以ー個(gè)負(fù)值結(jié)尾,作為結(jié)束標(biāo)志.剩余的輸入行被程序讀入并打印,然后輸入行中被選中的國(guó)的字符中被提取出來并打印?注意,每行第1列的列標(biāo)號(hào)為零.例如,如果輸入如ド:491220-1abcdatghijklnnopqrstuvwxyxH?llothere,howar?you?tanfine,thanks.S??you!By*則程序的輸出如下:Originalinput:abcdefghijklanopqrstuvwxyiRearrangedline:efghijmnopqrstuOriginalinput:Hellothere,howareyou?Rearrangedline:otherhowareOriginalinput:Iamfine,thanks.Rearrangedline:fine,hanks.Originalinput:Seeyou!Rearrangedline:you!Originalinputt3yeRearrangedline:這個(gè)程序的垂整之處在于它展示了當(dāng)你升始編寫C程序時(shí)所需要知道的絕大多數(shù)基本技巧.??這個(gè)程序從標(biāo)用?人中讀取?入行并在缽準(zhǔn)?出中打印這些■入行.??考小輸入行的扃西一行是該行內(nèi)事的一部分.?*?幡人的第1行是ー串列標(biāo)サ,本的量后以ー個(gè)奏聶結(jié)尾.?這接列標(biāo)號(hào)成対出現(xiàn),訛明雷要打卬的植入行的列的是衝.?例セ,0310127表示第0列到離3列,?10列到第12例的內(nèi)總將被打印.*/IInclude<stdio.n>IInclude<stdllb.h>Iinclude<string.h>?defineMAX_COLS20?defineMAXINPUT1000/?所值處理的最大外號(hào)?//?每個(gè)修入行的最大長(zhǎng)度ッintread^column_numbersIintvoidreaerange(char*output#intn_colu?n3,intconstcolumns[]tinimax);charconst*input,columns[]);intmain(void)(Antncolunnsjintcolumns(MAX_COLS11charinput[MAX_INPUT);charoutput(MAX_INPUT1;ハ過行處理的列好サ*//?雷霍處理的列敏?//?容妙?人行的敷典?//?ふ納翰出行的敷煙?/??決取該事列標(biāo)號(hào)*/n_columns=read_column_numbers(columns,MAX-COLS)i??球取.愛耳和打印剰余的?人行.ソwhile(geta(input)!=NULL)(printf<-Oriqindlinput:ts\n",input)irearrange(outputtinput,n_columnarcolumns”printf("Rearrangedline:ls\nrtroutput);1returnEXIT_SUCCESS#??或取列標(biāo)號(hào).加景趣出版定范圖唱不予理會(huì).*/intread_column_ftumberaIintcolumns[],intmax}<intntm?0;intch;??成港列柝9,如昊所球取的斂小于〇用勢(shì)止.*/while(num<maxi>&scant("Id",(columns[nun]) 1sscolumns(nun]>-0)num?"1;?,?認(rèn)已競(jìng)&取的悚サ為偈數(shù)個(gè).因?yàn)樗鼈兪且詫澋牟饰某鲇^的.*/lf<nun%2!?0)(puts<*L?stcolumnnumberisnotpaired.*);?xlt(EXIT_FAILURE);??去弄?行中包含最后一個(gè)散ギ的那毎分內(nèi)8.*/whlle((ch?getchar0)!?EOF“ch!-,\n*)returnnun;>/???爾理?入行,將界定列的字符連検在ー起.-出行HNUレ婚尾.*/voidrearrange(char*output?charconst*input?intn_columns,intconstcolumns[))Iintcol; /?column,依飢的下林?/intoutput_ool;/??出列計(jì)歛??/intlen; /,?入行的長(zhǎng)Jf?/len-strlen(input);output_col"0;/???處?,對(duì)列柝サ,*/tor(col-0;col<n_columns;col2)(intnchars?columns(col?1|-columns(coll?1;/??如果?入行給京或,出行聶簞已オ?就結(jié)束任務(wù).*/if(columns{col)>?l?n11output一col■-MAXINPUT-1)break;/??b栗?出行歌景空網(wǎng)不”,只復(fù)制可ヌ8鎮(zhèn)的數(shù)據(jù)./iffoutput_col?nchars>MAX_INPUT-I)nchars-MAX_INPVT-output_col-1;/???復(fù)制柏美的斂售.*/strncpy(output?output_col*input?columns[col],nchare)toutput_col?"nchars;output(outputacol)-,\0*;J程序1.!重排字符 rearrang.c空白和注以現(xiàn)在,讓我們仔細(xì)觀察這個(gè)程序.首先需要注意的是程序的空白:空行將程序的不同部分分隔開來:制表符(tab)用于縮進(jìn)語(yǔ)句,更好地顯示程序的結(jié)構(gòu)等等.C是ー種自由格式的語(yǔ)言,并沒有規(guī)則要求你必須怎樣書寫蕭句?然而?如果你在編寫程序時(shí)能第遵守些約定還是非常值得的,它可以使代碼更加容易閱讀和修改,千萬(wàn)不要小看了這一點(diǎn).清晰地顯示程序的結(jié)構(gòu)固然重要,但告訴讀者程序能做些什么以及怎樣做則更為重要?注軽(commern)就是用丁?實(shí)現(xiàn)這個(gè)功能./*?這個(gè)!!序從格??人中過取■入行弁在標(biāo)冷?出中打印這些?入行.?每個(gè)愴入行的方面一行是譲行內(nèi)容的ー。分.??入的第一行是ー?列林號(hào).?的最后以ー個(gè)黃數(shù)結(jié)尾.?這集刊標(biāo)號(hào)或?qū)潓缬^.說明???被ガ卬的?入行的外篇圍.?例セ,031012-1表示第0列到?3列,第10列到?1Z列的內(nèi)容樣被打印.這段文字就是注注,注釋以符號(hào)Z?開始,以符號(hào)?/結(jié)束.在C程序中,凡是可以插入空白的地方都可以插入注痔.然而,注釋不能嵌套,也就是說,第1個(gè)/?符號(hào)和第丨個(gè)?ノ符號(hào)之間的內(nèi)容都被看作是注韓,不管?&面還有多少個(gè)/?符號(hào)?在有些語(yǔ)言中,注拜有時(shí)用デ把段代碼“注杼掉”,也就是使這段代碼在程序中不起作用,但并不將其真正從源文件中刪除?在C語(yǔ)言中,這可不是個(gè)好主意.如果你試圖在一段代碼的首尾分別加ヒ/?和?/符號(hào)來“注春抻”這段代碼?你不定能如愿.,如果這段代碼內(nèi)部原先就有注釋存在,這樣做就會(huì)出問題。要從遷就ヒ刪除段C代硏,更好的辦法是使用*if指令?只要像下面這樣使用:!£0在“f和Hendif之間的程序段就可以有效地從程序中去除,即使這段代碼之間原先存在注群也無(wú)妨,所以這是種更為安全的方法.預(yù)處理指令的作用遠(yuǎn)比你想象的要大.我將在第14章詳細(xì)討論這個(gè)問題.預(yù)處理指令*include<atdio.h>?Include<atrinq.h>tdefineMAXCOLS20 /?能,處理的量大列サ?/*deiin?max_inputiooo/?每個(gè)?入行的?大長(zhǎng)度?/這5行稱為預(yù)處理指令(preprocessordirectives),因?yàn)樗鼈兪怯深A(yù)處理器(preprocessor)解驛的.預(yù)處理器讀入源代碼,根據(jù)預(yù)處理指令對(duì)其進(jìn)行修改,然后把修改過的源代碼遞交給編譯器.在我們的例F程序中,值處理器用名叫stdio.h的庫(kù)函數(shù)頭文件的內(nèi)容替換第I條#include指令語(yǔ)句,其結(jié)果就仿佛是stdio.h的內(nèi)容被逐字寫到源文件的那個(gè)位置.第2、3條指令的功能類似.只是它們所怦換的頭文件分別是stdlib.h和string.h.stdio.h頭文件使我們可以訪問標(biāo)準(zhǔn)1/0^(StandardVOLibnuy)中的函數(shù),這組函數(shù)用于執(zhí)行輸入和輸出?stdlib.h定義了EXITSUCCKS和EXIT_FA1LURE符サ.我們需要stringh頭文件提供的函數(shù)來操縱字符串.提示:加果你有一些聲明需要用于幾個(gè)不同的源文件,這個(gè)技巧也是一種方便的方法一你在ー個(gè)單獨(dú)的文件中編寫這些聲明,然后用んinclude指令把這個(gè)文件包含到需?要使用這些聲明的源文件中.這樣,你就只需?要這些聲明的ー份情貝,用不著在許多不同的地方進(jìn)行復(fù)制,避免了在維護(hù)這些代嗎時(shí)出現(xiàn)傳候的可能收.提示:另一種預(yù)處理指令是#deCnc,它把名字MAX.COLS定義為20,把名字MAXJNPUT定義為looo.當(dāng)這個(gè)名字以后出現(xiàn)在憑文件的任何地オ時(shí),它就會(huì)被替換為定義的值.由于它們被定義為字面值常量,所以這些名字不能出現(xiàn)于有些普通變量可以出現(xiàn)的場(chǎng)合(比如或值符的左邊).這些名字一般都大寫,用于提醒它們并非普通的更量.Mfcfine指令和其他語(yǔ)言中符號(hào)常量的作用臭似,其出發(fā)點(diǎn)也相同.加果以后你覺得20列不夠,你可以簡(jiǎn)單地修改MAX/OLS的定義,這樣你就用不者在整個(gè)桎序中到處尋找并修改所有表示列范圍的20,你有可能漏掉一個(gè),也可能把并非用于表示列范BB的20也修改了.intr?adcolunm_nua>ber8(intcolunns[]tIntmax);voidrearrange<char*outputfcharconst*input4intncolumns,intconstcolumns());這些聲明被稱為函敷原型(functionprototype).它們吿訴編評(píng)器這些以后將住源文件中定義的函數(shù)的特征.這樣,當(dāng)這些函數(shù)被調(diào)用時(shí),編譯器就能對(duì)它們進(jìn)行準(zhǔn)確性檢査.每個(gè)原型以ー個(gè)類型名開頭,表示函數(shù)返冋值的類型?感在返回類型名后面的是函數(shù)的名字,再后面是函數(shù)期望接受的叁數(shù).所以.函數(shù)rcad.cohimn.numben返回ー個(gè)整數(shù),接受兩個(gè)類型分別是並型數(shù)組和整型標(biāo)量的參數(shù).函數(shù)原型中學(xué)%的名字井祚必需.我這里給出參數(shù)名的H的是提示它們的作用.rearrange函數(shù)接受4個(gè)參數(shù)?其中第I個(gè)和第2個(gè)參數(shù)都是指針(pointeり?指針指定一個(gè)存儲(chǔ)于計(jì)算機(jī)內(nèi)存中的值的地址,大似于門牌號(hào)碼指定某個(gè)特定的家庭位丁街道的何處?指針院予CiS宮強(qiáng)大的威力,我將在第6章詳細(xì)講解指針,第2個(gè)和第4個(gè)參數(shù)被聲明為const,這去示函數(shù)將不會(huì)修改函數(shù)調(diào)用檸所傳遞的這兩個(gè)參數(shù).美使字void表示函數(shù)并不返回任何值,在其他語(yǔ)言里,這種無(wú)返回值的函數(shù)被稱為過程(procedure)..提示:假如這個(gè)衽序的源代網(wǎng)由幾個(gè)源文件所蛆尻,那么使用値品數(shù)的源文件都必須寫明該函救的原型,把原型放在頭文件中并使用"include指令包含它們,可以避Jし由于同一個(gè)聲明的多份拷貝而導(dǎo)致,的雄ジ性問題.main函數(shù)int?ain(void)這幾行構(gòu)成了mam由數(shù)定義的起始部分.每個(gè)C程序都必須有一個(gè)main函數(shù),因?yàn)樗浅绦驁?zhí)行的起點(diǎn)?關(guān)健宇int表示函數(shù)返冋ー個(gè)整型值,關(guān)健字void表示函數(shù)不接受任何參數(shù).main的散的函數(shù)體包括左花括號(hào)和與之相匹配的右花括號(hào)之間的任何內(nèi)容.請(qǐng)觀察一下縮進(jìn)是如何使程序的結(jié)構(gòu)顯得更為清喈的.Intncolusins;intcolumns(MAX_COLS);ch?rinputIMAX_IMPUTIntncolusins;intcolumns(MAX_COLS);ch?rinputIMAX_IMPUTレcharoutput[MAX_INPUT];/??要處事的列!k?//?8第,入行的數(shù)邕*//?白妁幢出行的敏綱?/這幾行聲明了4個(gè)變SLー個(gè)協(xié)型標(biāo)量,ー個(gè)整型數(shù)組以及兩個(gè)字符數(shù)組,所有4個(gè)変量都是main函數(shù)的局部変量:,其他函數(shù)不能根據(jù)它們的名字訪問它們.當(dāng)然,它們可以作為參故傳遏給其他函數(shù)./?*??取讀本列標(biāo)號(hào)*/n_columns-r?ad_column_n-jnt>ers{columns,MAX_COLS);這條語(yǔ)句調(diào)用函數(shù)read_column_numbcrs.數(shù)組columns和MAX_COLS所代表的常量(20)作為參數(shù)傳遞給這個(gè)函數(shù).在ざ語(yǔ)苜中;數(shù)組參數(shù)是以引用(re佗rencc)形ス進(jìn)行傳遞的,也就是住址調(diào)用,而標(biāo)信和常量則是按值(value泗遞的(分別類似于Pasca!和Modula中的var參數(shù)和值參數(shù)).在函數(shù)中對(duì)標(biāo)量參數(shù)的任何修改都會(huì)在函數(shù)返冋時(shí)丟失,因此,被調(diào)用函數(shù)無(wú)法修改調(diào)用函數(shù)以傳值形式傳遞給它的參數(shù).然而,當(dāng)被調(diào)用函數(shù)修改數(shù)組參數(shù)的其中一個(gè)元素時(shí),調(diào)用函數(shù)所傳遞的數(shù)組就會(huì)被實(shí)際地修改.事實(shí)上,關(guān)于C函數(shù)的參數(shù)傳遞規(guī)則可以表述如下:所有傳遞給浜數(shù)的糸效都是排值傳遞的.但是,當(dāng)數(shù)組名作為參數(shù)時(shí)就會(huì)產(chǎn)生按引用傳遞的效果,如上所示.規(guī)則和現(xiàn)實(shí)行為之間似乎存在明顯的矛盾之處,第8章會(huì)對(duì)此作出詳細(xì)解釋。/???逢取?處”奧打印利余的?人行.*/while(gets(input>!?NULL)1printf("Originalinput:ts\n",input);rearrange<output*inputfn^colunns,colunns)iprintf("RearrangedLine:?s\n",output);returnEXIT_SIX:CESS;>用戶描述這段代碼的注驛看上去似乎巧.些多余.但是,如今軟件幵銷的?大之處并非在于編耳,而是在于維護(hù).在修改段代碼時(shí)所遇到的第1個(gè)何鹿就是要搞清建代碼的功能.所以,如果你在代碼中插入一些東西,能使我他人(或許就是你自己!)在以后更容易理解它,那就非常值得這樣做。但是,要注意ぜ寫正確的注釋,并且在你修改代碼時(shí)要注意注驛的更新。注釋如果不正確那還不如沒有!這段代碼包含了一個(gè)while循環(huán)?在C語(yǔ)言中,while循環(huán)的功能和它在其他港言中?祥?它首先測(cè)試表達(dá)式的值,如果是假的(0)就跳過循環(huán)體,如果表達(dá)式的值是真.的(非〇).就執(zhí)行循環(huán)體內(nèi)的代碼,然后再重新測(cè)試表達(dá)式的值.這個(gè)循環(huán)代表了這個(gè)程序的主要邏輯.簡(jiǎn)‘而オ之,它表示:while我們遙可以?取另一行?入立打印,入行M?人行進(jìn)行?新整理.把它棄儲(chǔ)于output敷短ガ印?出縉果gets函數(shù)從標(biāo)準(zhǔn)輸入讀取?行文本并把它存儲(chǔ)于?作為參數(shù)傳遞給它的數(shù)組中.市輸入由一事字符組成,以ー個(gè)換行符(newline)結(jié)尾.gets函數(shù)丟棄検行符,井在該行的末尾存儲(chǔ)個(gè)NUL字で1(一個(gè)NUL字節(jié)是指字節(jié)模式為全〇的字節(jié),類似的這樣的字符常R)?然后,gets函數(shù)返回ー個(gè)非NULL值.表示該行已被成功讀取、當(dāng)gets函數(shù)被調(diào)用但事實(shí)上不存在軸入行時(shí),它就返冋NULL值.表示它到達(dá)了箱入的末尾(文件尾).在C程序中.處理字符串是常見的任務(wù)之一,盡管C語(yǔ)吉并不存在“string”數(shù)據(jù)類型,但在整個(gè)謠言中.存在一項(xiàng)約定:字符串就是呻以NUL字ガ結(jié)尾的字符,NUL是作為字符串終止符,它本身并不被看作是字符串的部分?字符串?!?stringliteral)就是源程序中被雙引號(hào)括起來的ー串字符.例如.字符串常量:?Hello"在內(nèi)存中占據(jù)6個(gè)字節(jié)的空間,按順序分別是H、c、I、卜。和NUL.pnntf函數(shù)執(zhí)行格式化的輸出.C語(yǔ)言的格式化箱出比較筒單,如果你是Modula或Pasca!的用戶,你肯定會(huì)對(duì)此蜷到愉快,primf函數(shù)接受多個(gè)參數(shù),其中第一個(gè)參數(shù)是一個(gè)字符中,描述輸出的格式.剩余的參數(shù)就是需要打印的值.格式常常以字符申常量的形式出現(xiàn)?格式字符串包含格式指定符(格式代碼)以及?些普通字符.這些件通字符將按照原樣逐字打印出來.但每個(gè)格式指定符將使后續(xù)參數(shù)的值按照它所指定的格式打印?表!.!列出了一些常用的格式指定符.如果數(shù)組inpu[包含字符串Hifriend!,那么下面這條語(yǔ)句printf("Originalinput:l?\nw,input);的打印結(jié)果是:Originalinput:Hifriends!后面以ー個(gè)換行符終止.衰1.1常用printf格式代碼幡式t義%d以つfllllH渉式打卬ー個(gè)?で値%〇以八戰(zhàn)制序式打卬一個(gè)?型值%x以ヤ六進(jìn)制形式打印ー個(gè)?皇值NUし是ASCU字符集中W字符的名字?它的字節(jié)模式為全0?NUU?指一個(gè)其值為。的疳H.它?】槨是?中值.其位也相同,所以它的可以互換使用.然而.你還是應(yīng)邊饅用適ウ的常因?yàn)樗‘?dāng)訴閱注程序的人不僅使用。這個(gè)假,曲Hfr訴他使用這個(gè)值的H的.椅サNULし在頭文件rtdioh中定義?另一方曲,芹小存在預(yù)定義的符號(hào)NUL.所以如果你想使用它而不是字符常維?\0',休必須自行定義?續(xù)表格式含義打印一個(gè)浮點(diǎn)值%c打印ー個(gè)字我%s打印個(gè)字符事\n換打例子程序接下來的?條語(yǔ)句調(diào)用rearrange函數(shù).后面3個(gè)參數(shù)是傳遞給函數(shù)的值,第1個(gè)參數(shù)則是函數(shù)將要?jiǎng)?chuàng)建并返回給main函數(shù)的答案.記住,這種參數(shù)是唯一可以返冋答案的方法,因?yàn)樗签`個(gè)數(shù)組。最后ー個(gè)printf函數(shù)顯示輸入行重新整理后的結(jié)果。最后,當(dāng)循環(huán)結(jié)束時(shí),main函數(shù)返回值EXTT_SUCCESS.讀值向掾作系統(tǒng)提示程序成功執(zhí)行.右花括號(hào)標(biāo)志著main函數(shù)體的結(jié)束.1.1.4read_column_numbers函數(shù)??求取列標(biāo)號(hào),得果館出帆定落圖則不予理會(huì).intre4d_column_numi>ers(inicolumns[],intcnax)(這幾行構(gòu)成了read-colurnn.numbcrs函數(shù)的起始部分.注意,這個(gè)聲明和早先出現(xiàn)在程序中的該函數(shù)驚型的參數(shù)個(gè)數(shù)和類型以及函數(shù)的返回值完全匹配.如果出現(xiàn)不匹配的情況,編譯器就會(huì)報(bào)錯(cuò)。在函數(shù)聲明的數(shù)組參數(shù)中,并未指定數(shù)組的長(zhǎng)度,這種格式是正確的,因?yàn)椴徽撜{(diào)用函數(shù)的程序傳遞給它的數(shù)組參數(shù)的長(zhǎng)度是多少?這個(gè)函數(shù)都將照收不談.這是個(gè)偉大的特性,它允許單個(gè)函數(shù)操縱任意長(zhǎng)度的維數(shù)組.這個(gè)特性不利的,面是函數(shù)沒法知道該數(shù)組的長(zhǎng)度?如果確實(shí)需要數(shù)組的長(zhǎng)度,它的值必須作為ー個(gè)単獨(dú)的參數(shù)傳遞給函數(shù)“當(dāng)本例的read?column_numbers函數(shù)被調(diào)用時(shí),傳遞給函數(shù)的其中一個(gè)參數(shù)的名字碰巧與上面給出的形參名字相同。但是,其余幾個(gè)參數(shù)的名字與對(duì)應(yīng)的形參名字并不相同.和絕大多數(shù)語(yǔ)カー樣,C語(yǔ)古中形式參數(shù)的名字和實(shí)際參數(shù)的名字并沒有什么關(guān)系.你可以讓兩者相同,但這并非必須?intnum-OjIntch)這里聲明了兩個(gè)變量,它們是該函數(shù)的局部變量,第I個(gè)變5I在聲明時(shí)被初始化為0,但第2個(gè)變局并未初始化?更準(zhǔn)確地說,它的初始值將是ー個(gè)不可預(yù)料的值,也就是垃圾。在這個(gè)函數(shù)里,它沒有初始值并不胡事.因?yàn)楹瘮?shù)對(duì)這個(gè)變量所執(zhí)行的第1個(gè)操作就是對(duì)它賦值./*ハ取薄列標(biāo)號(hào).如果所談取的我小チ。*停止.*/這又是一個(gè)循環(huán).用于讀取列標(biāo)號(hào)?scanf函數(shù)從標(biāo)準(zhǔn)輸入讀取字符并根據(jù)格式字符中對(duì)它們進(jìn)行轉(zhuǎn)換——類似于printf函數(shù)的逆操作,scanf函數(shù)接受幾個(gè)參數(shù),其中第1個(gè)參數(shù)是ー個(gè)格式字符巾,用于描述期望的輸入類型.剩余幾個(gè)參數(shù)都是變量,用于存儲(chǔ)函數(shù)所讀取的輸人數(shù)據(jù).scanf函數(shù)的返冋值是函數(shù)成功轉(zhuǎn)換并存儲(chǔ)于參數(shù)中的值的個(gè)數(shù).?吿:時(shí)于這個(gè)函數(shù),你必須小心在意,理由有二,首先,由于scanf函數(shù)的實(shí)現(xiàn)原理,所有標(biāo)量參數(shù)的苗而必須加上一個(gè)?&-符號(hào).關(guān)于這點(diǎn),第8章我會(huì)解鋒清處.敎組冬敷前面不常要加上符號(hào)、但是,數(shù)組恭做中加果出現(xiàn)了下標(biāo)引用.也就是說實(shí)除參數(shù)是敬娘的某個(gè)特定元去,那么它的前面也必須加上-&W符號(hào),在第15章,我會(huì)解修在標(biāo)量察做前面加上符號(hào)的必備!!.現(xiàn)在,你只要知道必須加上這個(gè)符號(hào)就行了,因?yàn)槿绻麤]有它們的話,程序就無(wú)法正收運(yùn)行.警告:第二個(gè)需要注重的地方是格式代碼,它與printf函收的格式代碼顏為相似卻又并不完全相同,所以很容易引起混清.表】ユ蛆略列出了一些你可能會(huì)在scanf函數(shù)中用到的格式代瑪.津奇.苜5個(gè)格式代碼用于飛取標(biāo)量值,所以変量糸斂的材面必須加上-&w符號(hào).使用所有格式碼(除了%c之外)時(shí),蛤入值之前的空白(空格.制表符,操行符等)會(huì)校找過,值后面的空白表示it值的傳束.因此,用%s格式碼物入字符串吋,中同不能包含空白.除了表中所列之外,還存在許多格式代碼,但這"里面的這幾個(gè)格式化嗎對(duì)于應(yīng)付我們現(xiàn)在的需求已經(jīng)足夠了.我們現(xiàn)在可以解釋表達(dá)式:scanf("td"*ftcolunnslnujn))格式円%d表示需要讀取ー個(gè)整や值?字符是從標(biāo)準(zhǔn)愉入讀取,前導(dǎo)空白將被跳過?然后這些數(shù)字被轉(zhuǎn)換為ー個(gè)整數(shù),結(jié)果存儲(chǔ)丁?指定的數(shù)組元素中.我們需要在參數(shù)前加上ー個(gè)“&”符號(hào),因?yàn)閿?shù)組下標(biāo)選拝的是個(gè)単的數(shù)組元素.它是ー個(gè)標(biāo)蹴.while循環(huán)的測(cè)試條件由3個(gè)部分蛆成:nuai<max這個(gè)測(cè)試條件確保函數(shù)不會(huì)讀取過多的值,從而痔致數(shù)組溢出。如果scanf函數(shù)轉(zhuǎn)換了一個(gè)整數(shù)之后,它就會(huì)返冋丨這個(gè)值?最后,colunns(nu?)>"0這個(gè)裊達(dá)式確保函數(shù)所讀取的值是正數(shù)。如果兩個(gè)測(cè)試條件之一的值為假,循環(huán)就會(huì)終止.>1.2 常用scaM格式碼幡式含義蜜?奧量%d讀取ー個(gè)整用值int%M?取個(gè)長(zhǎng)整整值long%f波取一個(gè)女や值(浮京?hfloat%lf遺取ー個(gè)雙制度實(shí)セ國(guó)doubleHe讀取ー個(gè)字符char%?從?人屮?取?個(gè)オ將電dur型數(shù)組但是.即使你在它前面加上一個(gè)"金”也投的什么不對(duì),所以如累你耳收,也可以加ヒ它?Cぞ罡せ提示:標(biāo)準(zhǔn)并未硬性規(guī)定C輻譯器對(duì)數(shù)組下標(biāo)的有效性迸行檢查,而且絕大多數(shù)C絡(luò)譯器瓏實(shí)也不遜行檢查.因此,如果你需要進(jìn)行數(shù)蛆下標(biāo)的有效性檢金,你必須自行編寫代瑪,如果此處不進(jìn)行numvmax這個(gè)測(cè)試,而且程序所讀取的文件包含超過20個(gè)列標(biāo)號(hào),那么多出來的值就會(huì)存鋪在緊隨數(shù)組之后的內(nèi)存位置,這樣就會(huì)破壞原先存儲(chǔ)在這個(gè)位JE的數(shù)據(jù),可能是其他変量,也可以是函戦的返回地竝.這可能會(huì)導(dǎo)致多種結(jié)果,程序很可能不會(huì)按體你預(yù)想的那樣運(yùn)行.也&是“邏輯與”操作符.要使整個(gè)表達(dá)式為真,&&操作符兩邊的表達(dá)式都必須為我,然而,如果左邊的表達(dá)式為假,右邊的表達(dá)式便不再進(jìn)行求值,曲為不管它是真是假,帙個(gè)表達(dá)式總是假的?在這個(gè)例子中,如果num到達(dá)了它的最大值,循環(huán)就會(huì)終止し而表達(dá)式columns(nun]便不再被求值。警告:此處需要小心,當(dāng)你實(shí)際上想使用&&振作符時(shí),千萬(wàn)不要誤用了也緑作符.ゆ操作符執(zhí)行“按位與”的操作,雖然有些時(shí)候它的操作結(jié)果和&&操作符相同,但很多情丸下都不一樣.我將在第5章討論這些操作符.3f1函數(shù)每次調(diào)用時(shí)都從標(biāo)準(zhǔn)輸入讀取ー個(gè)十進(jìn)制整數(shù).如果轉(zhuǎn)換失敗,不管是因?yàn)槲募褟阶x完還是因?yàn)橄麓屋斎氲淖址麩o(wú)法轉(zhuǎn)換為整數(shù),函數(shù)都會(huì)返回0.這樣就會(huì)使整個(gè)循環(huán)終止.如果輸入的字符可以合法地轉(zhuǎn)換為整數(shù),那么這個(gè)值就會(huì)轉(zhuǎn)換為二進(jìn)制數(shù)存儲(chǔ)于數(shù)組元素columns[num]中.然后,scant'函數(shù)返冋し警告:注意:用于測(cè)試兩個(gè)表達(dá)式是否相等的標(biāo)作符是ー.加果誤用了二黑作符,雖然它也是合法的表達(dá)式,但其結(jié)果幾乎肯定和你的本章不一樣:它將執(zhí)行峨僮攝作而不是比較操作!但由于它也是ー個(gè)合法的友達(dá)式,所以螭譯器無(wú)法為你找出這個(gè)錯(cuò)認(rèn)と在進(jìn)行比較操作時(shí),千萬(wàn)要注章你所使用的是兩個(gè)等號(hào)的比校操作符.如果你的程序無(wú)法運(yùn)行.ホ檢查一下所有的比校操作符,看若是不是這個(gè)地方出了問題ー相信我,你肯定會(huì)犯這個(gè)錯(cuò)誤,而且可能不止一次.我自己就曾經(jīng)把過這個(gè)裾淡.接下來的一個(gè)&&操作符確保在scanf函數(shù)成功讀取了一個(gè)數(shù)之后オ對(duì)這個(gè)數(shù)進(jìn)行是否賦值的測(cè)試?語(yǔ)句nun1;使變量num的值増加1,它相當(dāng)于下面這個(gè)表達(dá)式num-nun+以后我將解釋為什么C語(yǔ)言提供了兩種不同的方式來増加一個(gè)変量的值'??榻環(huán)終止(Zkx叩2)a倉(cāng)句話的意思是稱壞結(jié)項(xiàng)而不是它突然出現(xiàn)了毛鱗,這句話源于2m句,我們將在第4?討論它?2n些較新的腳衞お在發(fā)現(xiàn)if和whilぐ我達(dá)式中使用咳值得時(shí)會(huì)發(fā)悵?吿信息,其段論是在這樣的上ド文環(huán)境中,用戶需要使用W段操作的可能性畫迖大于獻(xiàn)偵操柞?,加上前臓和后殿T件符,事丈上共有4腫方法増加一個(gè)變量的值.???認(rèn)已最讀取的標(biāo)號(hào)為貫敏小.因?yàn)樗鼈兪且猿蓪澋磨胧匠雎?*/if(nunI2)?0)(puts(*I<?stcolumnnumberisnotpaired.M);exit(EXIT_FAILURE);)這個(gè)測(cè)試椅責(zé)程序所讀取的整數(shù)是否為偶數(shù)個(gè),這是程序規(guī)定的,因?yàn)檫@些數(shù)字要求應(yīng)對(duì)出現(xiàn)?%操作符執(zhí)行整數(shù)的除法,但它給出的結(jié)果是除法的余數(shù)而不是商。如果num不是ー個(gè)偶數(shù),它除以2之后的余數(shù)將不是。?puts函數(shù)是gets函數(shù)的愴出版木,它把指定的字符串寫到標(biāo)準(zhǔn)輸出并在末尾添上一個(gè)換行符.程序接著調(diào)用exit函數(shù),終止程序的運(yùn)行?EX1T_FAILURE這個(gè)值被返冋給操作系統(tǒng),提示出現(xiàn)了倍識(shí)./???圣弄?行中包含最后一個(gè)歟字的那部分內(nèi)自.while((ch-g?tcher〇)!"EOF6,ch?*'\n')當(dāng)$canf函數(shù)對(duì)輸入值進(jìn)行轉(zhuǎn)換時(shí).它只讀取需要讀取的字符.這樣.該輸入行包含「最后ー個(gè)值的剰余部分仍會(huì)留在那電,等恃被讀取.它可能只包含作為終止符的換行符,也可能包含其他字符.不論如何,while循環(huán)將讀取并丟棄這些剰余的字符,防止它們被解釋為第1行數(shù)據(jù)?下面這個(gè)表達(dá)式(ch?getchar())?-EOFch!-*\n*值得花點(diǎn)時(shí)間討論.首先,getchar函數(shù)從標(biāo)準(zhǔn)輸入讀取ー個(gè)字符并返回它的值?如果輸入中不再存在任何字符,函數(shù)就會(huì)返回常量EOF(在sidio.h中定義),用「提示文件的結(jié)尾.從gctchar函數(shù)返冋的值被R給變奴ch,然后把它與EOF進(jìn)行比較?在賦值表達(dá)式兩端加上括號(hào)用于確保賦值操作先丁比較愫作進(jìn)行.如果ch等于EOF,整個(gè)表達(dá)式的值就為假,循環(huán)將終止.若非如此,再把ch與操行符進(jìn)行比較.如果兩者相等,循環(huán)也將終止?因此,只有門輸入尚未到達(dá)文件尾并且輸入的字符并非換行符時(shí),表達(dá)式的值オ是R的(循環(huán)將繼續(xù)執(zhí)行).這樣,這個(gè)循環(huán)就能刪除當(dāng)前網(wǎng)入行最后的剩余字符.現(xiàn)在讓我們進(jìn)入有趣的部分.在大多數(shù)其他語(yǔ)言中,我們將像下面這個(gè)樣,編寫循環(huán):ch?qetchar()f .while<ch(■BOF“CH!-,\n?)
ch-getchar(”它將讀取ー個(gè)字符,接ド來如果我們尚未到達(dá)文件的末厘或讀取的字符并不是換行符,它將繕續(xù)讀取下ー個(gè)字符.注意這里兩次出現(xiàn)了F面這條語(yǔ)句ch■g?tch?r()tC可以把賦值操作越含『while語(yǔ)句內(nèi)部,這樣就允許程序員消除冗余語(yǔ)句.提示1例子程序中的那個(gè)融壞的功能和上面這個(gè)纏環(huán)相同,但它包含的語(yǔ)句要少ー些.無(wú)可爭(zhēng)議,這種附式可讀性上一點(diǎn).僅僅根據(jù)這個(gè)值由,你就可以理直氣壯地聲林這料線踢技巧應(yīng)該避免使用.但是,你之所以會(huì)先得這料冊(cè)式的代瑪可讀姓校屋,只是因?yàn)槟銓?duì)C語(yǔ)言及其輻程的習(xí)慣用法不熟態(tài)之故.經(jīng)驗(yàn)豐富的C程序員在閱讀(和桀寫)這類語(yǔ)句時(shí)根本不會(huì)出現(xiàn)困焼.在沒有明顯的好處時(shí),你應(yīng)該遵免使用影嘀代碼可讀性的オ法,但在這種編猩習(xí)慣用法中,同樣的語(yǔ)句少寫一次帶來的維護(hù)方面的好處要更大一些.ー個(gè)經(jīng)常問到的問題是I為什么ch被聲明為整型,而我們事實(shí)上需要它來讀取字符?答案是EOF是ー個(gè)整型值,它的位數(shù)比字符類型嬰多,把ch聲明為整型可以防止從輸入讀取的字符意外地被解狎?yàn)镋OF?但同時(shí),這也意味著接收字符的ch必須足夠大,足以容納EOF,這就是ch使用核型值的原因?正如第3章所討論的那樣,字符只是小整型數(shù)而已,所以用一個(gè)整型変就容納字符值并不會(huì)引起任何問題.提示:時(shí)這段程序最后還有一點(diǎn)說明:這個(gè)while緬環(huán)的械環(huán)體沒有任何語(yǔ)句.伍僅完成while表達(dá)式的測(cè)試部分就,足以達(dá)到我們的目的,所以循環(huán)體就無(wú)事可干.你僞爾也會(huì)遇到這類欄環(huán),處亙它們應(yīng)該沒何趣.while語(yǔ)句之后的單獨(dú)ー個(gè)分號(hào)稱為空語(yǔ)句(emptystalemem).它就是應(yīng)用于目前這個(gè)場(chǎng)合.也就是語(yǔ)法要求這個(gè)地オ出現(xiàn)一條語(yǔ)句但又無(wú)需執(zhí)行任何任務(wù)的時(shí)悽.這個(gè)分號(hào)獄占一行,這是為了防止讀者錯(cuò)謁地以為接下氽的語(yǔ)句也是禰環(huán)體的一部分.returnnun;Jretun!語(yǔ)句就是函數(shù)向調(diào)用它的表達(dá)式返回個(gè)值.在這個(gè)例子里,變量num的值被返回給調(diào)用該函數(shù)的程序,后者把這個(gè)返回值賦值給主程序的!!」:。hunns變fit.1.1.5rearrange函數(shù)/??火??人行,將指定列的字句逐校在ー起,輸出行Hmul岫尾.?/voidrearrange<char"output*charconst*input4intn_columns,intconstcolumns[])(intcol; /?columns&風(fēng)的下株a/intoutput_col;/?看出列計(jì)黴??/intlen; /??入行的長(zhǎng)度?/這些語(yǔ)句定義了rearrange函數(shù)并聲明了一一也局部変量.此處?冇理的一點(diǎn)是,前兩個(gè)參數(shù)被聲明為指針,但在函數(shù)實(shí)際調(diào)用時(shí),傳給它們的參數(shù)卻是數(shù)組名.カ數(shù)姐名作為實(shí),時(shí),傳給函數(shù)的實(shí)際上是ー個(gè)指向數(shù)組起始位置的指針,也就是數(shù)組在內(nèi)存中的地址,正因?yàn)閷?shí)際傳遞的是ー個(gè)指針而不是份數(shù)組的拷貝.オ使數(shù)組名作為參數(shù)時(shí)具備r住址調(diào)用的語(yǔ)義,函數(shù)可以按照操縱指針的方式來操縱實(shí)參,也可以像使用數(shù)組名ー樣用下標(biāo)來引用數(shù)組的兀素.第8季將對(duì)這些技巧進(jìn)行更詳細(xì)的說明。但是,由于它的傳址調(diào)用語(yǔ)義,如果函數(shù)修改了形參數(shù)組的元素,它實(shí)標(biāo)上將修改實(shí)參數(shù)組的索.因此,例子程序把columns聲明為con”就有兩カ面的作用?首先,它聲明該函數(shù)的作者的意圖是這個(gè)參數(shù)不能被修改.其次,它導(dǎo)致編譯器去驗(yàn)證是否違背該意圖.因此,這個(gè)函數(shù)的國(guó)用者不必?fù)?dān)心例f程序中作為第4個(gè)參數(shù)傳遞給函數(shù)的數(shù)組中的兀素會(huì)被修改?l?n-strlenfinput);output^col■0;?處理修対列柝勺./for<col■0;col<n_columns;col?-211這個(gè)函數(shù)的真正工作是從這里開始的.我們首先獲得輸入字符串的長(zhǎng)度,這樣如果列標(biāo)號(hào)超出了輸入行的瘡圍,我們就忽略它們.C語(yǔ)言的fbr語(yǔ)句衆(zhòng)它在其他語(yǔ)言中不太像,它更像是while語(yǔ)句的ー鐘常用風(fēng)格的筒耳法.fbr語(yǔ)句包含3個(gè)表達(dá)式(顆便說一下,這3個(gè)表達(dá)式都是可選的).第一個(gè)表達(dá)式是初始部分,它只在循環(huán)開始前執(zhí)行一次.第二個(gè)表達(dá)式是測(cè)試部分.它在循環(huán)毎執(zhí)行ー?次后都要執(zhí)行一次.第三個(gè)表達(dá)式是調(diào)出部分,它在每次循環(huán)執(zhí)行完畢后都要執(zhí)行一次,但它在測(cè)試部分之前執(zhí)行.為了清題起見,上面這個(gè)fbr循環(huán)可以改寫為如下所示的while循環(huán):col"0;while(col<ncolusins){?邱體"col?-*2;)intnchars-colunna(col?1]-columns(col)?1//???如果愴入行始泉或,出行教氟已満,就結(jié)東任務(wù).*/if(columnsIcol)>?l*n11ojtput-col—MAX_INPUT-1)?break;/???如果?出行數(shù)據(jù)空間不務(wù),只復(fù)制可以將納的敷譽(yù).*/if(outputcol?nchara>MAX_IHPUT-1)nchars?MAX_1NPUT-output_col-1;/???夏川相關(guān)的斂據(jù).*/?trnepy(output?output_colfinput?columns(col)*nchars)joutput_col nchars;這是fbr循環(huán)的循環(huán)體,它一開始計(jì)算當(dāng)前列能用內(nèi)字符的個(gè)數(shù).然后決定是否繼續(xù)進(jìn)行循環(huán).如果輸入行比起始列短,或不輸出行已滿,它便不再執(zhí)行任務(wù),使用break語(yǔ)句立即退出循環(huán)?接下來的一個(gè)測(cè)試檢査這個(gè)能圍內(nèi)的所有字符是否都能放入輸出行中,如果不行,它就把nchars調(diào)厘為數(shù)組能的容納的大小?提示:在這種只使用一次的“一次性”程序中,不執(zhí)行敦姬邊界檢費(fèi)之契的任務(wù),只是離單地讓依如?足夠大”從而使其不溢出的做法是很常見的,不?的是.這料方法有時(shí)也應(yīng)用于實(shí)際產(chǎn)品代碼中.這料做法在絶大多效情況下將導(dǎo)致,大部分?jǐn)?shù)蛆空冋被浪費(fèi),而且即使這樣有時(shí)仍會(huì)出現(xiàn)溢出,從而導(dǎo)致程序失敗,.最后,stmcpy函數(shù)把選中的字符從輸入行復(fù)制到輸出行中可用的下一個(gè)位置.stmcpy函數(shù)的前兩個(gè)參數(shù)分別是目標(biāo)字符串和源字符中的地址。在這個(gè)調(diào)用中,目標(biāo)字符中的位置是輸出數(shù)組的起始地址向后偏移output_col列的地址,源字符串的位置則是輸入數(shù)組起始地址向后偏移columns(col)個(gè)位置的地址,第3個(gè)參數(shù)指定需要復(fù)制的字符數(shù)、.輸出列計(jì)數(shù)器隨后向后移動(dòng)nchars個(gè)位置..I循環(huán)結(jié)束之后,輸出字符串將以?個(gè)NUL字符作為終止符。注意,在循環(huán)體中,函數(shù)經(jīng)過精心設(shè)計(jì),確保數(shù)組仍有空間容納這個(gè)終止符.然后.程序執(zhí)行流便到達(dá)了函數(shù)的末尾,于是執(zhí)行ー條附式的return語(yǔ)句.由ア不存在顯式的rctum語(yǔ)句,所以沒有任何值返回給調(diào)用這個(gè)函數(shù)的表達(dá)式‘在這里,不存在返回值并不會(huì)有問題?因?yàn)檫@個(gè)函數(shù)被聲明為void(也就是說,不返冋任何位).并且當(dāng)它被調(diào)用時(shí),并不對(duì)它的返冋值進(jìn)行比較操作或把它賦值給其他變盤.1.2補(bǔ)充說明本章的例子程序描述了許多c語(yǔ)言的基礎(chǔ)知也.但在你親自動(dòng)手編寫程序之前,你還應(yīng)該知道ー些東西.首先是?utcha!函數(shù).它與gctchar函數(shù)相對(duì)應(yīng),它接受一個(gè)整型參數(shù),并在標(biāo)準(zhǔn)輸出中打印該字符(如前所述,字符在本質(zhì)上也是麼型).同時(shí),在函數(shù)陣?yán)锎嬖谠S多操縱字符屮的函數(shù).這里我將簡(jiǎn)單地介紹幾個(gè)最有用的.除非特別說明,這些函數(shù)的參數(shù)既可以是字符串常量,也可以是字符型數(shù)組名.還可以是ー個(gè)指向字符的指針.strepy函數(shù),slmcpy函數(shù)類似,但它并沒有限制需要品制的字符數(shù)量。它接受兩個(gè)參數(shù):第2個(gè)字符串參數(shù)將被復(fù)制到第1個(gè)字符串參數(shù),第1個(gè)字符串原有的字符將被覆読?strcat函數(shù)也接受兩個(gè)參數(shù),但它把第2個(gè)字符串參數(shù)添加到第I個(gè)字符中參數(shù)的末尾。在這兩個(gè)函數(shù)中,它們的第1個(gè)字符串參數(shù)不能是字符串常量。而旦,確保目標(biāo)字?串仃足夠的空冋是程序員的貢任,函數(shù)并不對(duì)其進(jìn)行檢豈.在字符申內(nèi)進(jìn)行搜索的函數(shù)是strchr,它接受兩個(gè)參數(shù),第I個(gè)參數(shù)是字符中,第2個(gè)參數(shù)是個(gè)字符。這個(gè)函數(shù)在字符串參數(shù)內(nèi)捜索字符參數(shù)第1次出現(xiàn)的位置,如果搜索成功就返冋指向這個(gè)位置的指針,如果捜索失敗就返冋?個(gè)NULL指針。stntr函數(shù)的功能類似,但它的第2個(gè)參數(shù)也是ー個(gè)字符串,它捜索笫2個(gè)字符串在第1個(gè)字符串中第1次出現(xiàn)的位實(shí)?13編譯你編譯和運(yùn)行C程序的方法取決于你所使用的系統(tǒng)類型?在UNIX系統(tǒng)中,要編譯ー個(gè)存儲(chǔ)于文件usting.c的程序,要使用以下命令,相明的讀キ會(huì)注意我,如果遇到特別長(zhǎng)的愴入行,我M并沒有辦法防カ師用函數(shù)溢出?這個(gè)瘍洶確實(shí)是g兩數(shù)的購(gòu)附.所以欣謨検用眼0將在猿!5磔!I述).如果圖字符串的字符數(shù)少チ第3個(gè)參數(shù)指定的製制數(shù)4標(biāo)字符串中剰余的字節(jié)將用NUし字節(jié)填充?cctestin9-c在PC中,你需要知道你所使川的是哪種編評(píng)器.如果是Bo”andC++,在MS-DOS窗口中,可以使用下面的命令:bcctesting.ctesting總結(jié)本章的目的是描述足堪的c語(yǔ)ホ的基礎(chǔ)知識(shí),使你對(duì)c語(yǔ)ホ有一個(gè)整體的印象.有r這方面的基礎(chǔ),在接ド來章節(jié)的學(xué)習(xí)中,你會(huì)更加容務(wù)理解?本章的例子程序說明了許多要點(diǎn)?注理以/?開始,以?,結(jié)束,用于在程序屮添加些描述性的說明.*include預(yù)處理指令可以使?個(gè)函數(shù)陣頭文件的內(nèi)容由編譯器進(jìn)行處理,伙kfine指令允許你給字面值常量取個(gè)符號(hào)名.所有的C程序必須有一個(gè)main函數(shù),它是程序執(zhí)行的起點(diǎn)?函數(shù)的標(biāo)量參數(shù)通過傳值的方式進(jìn)行傳遞,而數(shù)組名參數(shù)則具有傳址調(diào)用的語(yǔ)義,字符申是ー串由NUL字ザ結(jié)尾的字符,并且有ー組昨函數(shù)以不同的方式專門用于操縱字符中,primf函數(shù)執(zhí)行格式化給出,scanf函數(shù)用于格式化輸入,getchar和putchar分別執(zhí)行作格式化字符的輸入和輪出〇if和while語(yǔ)句在C語(yǔ)言中的用途是它們?cè)谄渌O言中的用途差不太多.通過觀察例子程序的運(yùn)行之后,你或許想親白編寫?些程序?你可能覺得C語(yǔ)言所也含的內(nèi)容應(yīng)諦遠(yuǎn)遠(yuǎn)不止這些,確實(shí)如此,但是,這個(gè)例子程序應(yīng)該足以讓你上手了.警告的總結(jié).在scanf函數(shù)的標(biāo)量參數(shù)前未添加也字符。.機(jī)械地把prinlf函數(shù)的格式代碼照搬Fscanf函數(shù)。.在應(yīng)該使用&&操作符的地方誤用了&操作符a.誤用=操作符而不是ー掾作符來測(cè)試相等性.編程提示的總結(jié).使用#include指令避免重記聲明..使用Mdlnc指令給常量值取名?.在#include文件中放置函數(shù)原型。.在使用ド標(biāo)前先檢査它們的值“.在while或江表達(dá)式中蘊(yùn)含賦值操作..如何編寫個(gè)空循環(huán)體..始終要進(jìn)行檢査,確保數(shù)組不越界.問題i.c是一種自由形式的語(yǔ)言,也就是說并沒有規(guī)則規(guī)定它的外觀究竟應(yīng)該怎樣、但本章的例r程序遵循了一定的空白使用規(guī)則,你對(duì)此冇何想法?>2.把聲明(如函數(shù)原型的聲明)放在頭文件
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小產(chǎn)權(quán)房房屋租賃合同范本
- 6人簽字合同范本
- 養(yǎng)殖租賃合同范本
- 服務(wù)員勞務(wù)服務(wù)合同范本
- 分公司使用合同范例
- 個(gè)人買賣商鋪合同范本
- 養(yǎng)狗協(xié)議合同范本
- 北美谷物航次合同范例
- 別墅租賃服務(wù)合同范本
- 2025年中國(guó)乙酰麥迪霉素片市場(chǎng)運(yùn)行態(tài)勢(shì)及投資戰(zhàn)略咨詢研究報(bào)告
- (正式版)HGT 6313-2024 化工園區(qū)智慧化評(píng)價(jià)導(dǎo)則
- 單縣煙草專賣局QC課題多維度降低行政處罰文書出錯(cuò)率
- 毫針刺法(全)教學(xué)課件
- 金風(fēng)科技-風(fēng)電產(chǎn)業(yè)集團(tuán)-供應(yīng)商現(xiàn)場(chǎng)作業(yè)基礎(chǔ)安全考試附答案
- 公共關(guān)系學(xué)完整教學(xué)課件
- 人工智能機(jī)器人科學(xué)小報(bào)手抄報(bào)簡(jiǎn)報(bào)
- 三年級(jí)下冊(cè)美術(shù)課件-第1課 燈彩輝映|浙美版 (共19張PPT)
- 硫酸銨廢水MVR蒸發(fā)結(jié)晶
- 原子物理學(xué)第五章-多電子原子:泡利原理
- 35kV輸電線路工程旋挖鉆孔專項(xiàng)施工方案
- 固定資產(chǎn)借用登記表
評(píng)論
0/150
提交評(píng)論