C程序員從校園到職場(chǎng)_第1頁(yè)
C程序員從校園到職場(chǎng)_第2頁(yè)
C程序員從校園到職場(chǎng)_第3頁(yè)
C程序員從校園到職場(chǎng)_第4頁(yè)
C程序員從校園到職場(chǎng)_第5頁(yè)
已閱讀5頁(yè),還剩132頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C程序員從校園到職場(chǎng)第1第2第3第4第5第6第7第8第9第10SQL語(yǔ)句和Shell命令第11附錄A同行評(píng)審第1章 概述本章介紹C語(yǔ)言的發(fā)展歷史和主要特點(diǎn),以及實(shí)際項(xiàng)目工作中軟件開發(fā)工程師常用到的工具軟件。C語(yǔ)言的發(fā)展歷史C語(yǔ)言之父C語(yǔ)言是1972年由美國(guó)貝爾實(shí)驗(yàn)室的計(jì)算機(jī)科學(xué)家DennisRitchie(丹尼斯·里奇)設(shè)計(jì)發(fā)明的。因此,DennisRitchie被譽(yù)為“C語(yǔ)言之父”(他已于2011年10月9日去世,享年70歲)。圖1.1所示的人物就是DennisRitchie。圖1.1 “C語(yǔ)言之父”DennisRitchieDennisRitchie曾在哈佛大學(xué)學(xué)習(xí)物理學(xué)和應(yīng)用數(shù)學(xué),1967年進(jìn)入貝爾實(shí)驗(yàn)室工作。作為計(jì)算機(jī)科學(xué)家,在他身上有很多可貴的、值得我們學(xué)習(xí)的品格,例如:第一,他對(duì)所做的事十分有興趣;第二,跳出舒適區(qū)工作,不斷挑戰(zhàn)自己;第三,有創(chuàng)新思維,不拘泥于條條框框;第四,喜歡分享,不藏匿自己的核心技術(shù)。DennisRitchie對(duì)計(jì)算機(jī)科學(xué)的貢獻(xiàn)主要有以下幾個(gè)方面:第一,作為“C語(yǔ)言之父”,他最大的貢獻(xiàn)當(dāng)然是發(fā)明了C語(yǔ)言;第二,1973年他與KenThompson合作,把UNIX90%以上的內(nèi)容用C語(yǔ)言改寫,因此也被譽(yù)為“UNIX之父”;第三,1978年他與BrianW.Kernighan一起出版了名著TheCProgrammingLanguage(《C程序設(shè)計(jì)語(yǔ)言》),此書已被翻譯成多種語(yǔ)言,成為C語(yǔ)言方面最權(quán)威的教材之一?;贒ennisRitchie的杰出成就,1983年他與KenThompson一起獲得了圖靈獎(jiǎng)。1999年,DennisRitchie和KenThompson因?yàn)樵诎l(fā)展C語(yǔ)言和UNIX操作系統(tǒng)方面所做出的貢獻(xiàn)一起榮獲了美國(guó)國(guó)家技術(shù)獎(jiǎng)?wù)隆語(yǔ)言的演進(jìn)作為在國(guó)際上廣泛使用的計(jì)算機(jī)編程語(yǔ)言,C語(yǔ)言的發(fā)展簡(jiǎn)史如圖1.2所示。C語(yǔ)言到底有多少人在用?C語(yǔ)言的受歡迎程度如何?如圖1.3所示為CodeForge網(wǎng)站公布的2014年11月“我最喜愛的編程語(yǔ)言”排行榜。這個(gè)排行榜來(lái)自2014年11月對(duì)56000多名軟件工程師的問(wèn)卷調(diào)查。該排行榜非常清楚地反映了在世界不同國(guó)家和地區(qū)各種編程語(yǔ)言的流行程度,可供軟件工程師及IT相關(guān)行業(yè)人士參考。從圖1.3可以看出,在全球范圍內(nèi),C語(yǔ)言的受歡迎程度位居排行榜的榜首。因此,C語(yǔ)言使用得非常廣泛。圖1.2 C語(yǔ)言的發(fā)展簡(jiǎn)史圖1.3 2014年11月“我最喜愛的編程語(yǔ)言”排行榜C語(yǔ)言的主要特點(diǎn)C語(yǔ)言是一種功能強(qiáng)大的、被廣泛應(yīng)用的面向過(guò)程的編程語(yǔ)言,可用于編寫系統(tǒng)軟件和應(yīng)用軟件。C語(yǔ)言的主要特點(diǎn)如圖1.4所示。如圖1.4所示,C語(yǔ)言的諸多特點(diǎn)使其越來(lái)越受到廣大軟件開發(fā)人員的青睞,也使其成為了使用人數(shù)最多的計(jì)算機(jī)編程語(yǔ)言之一。學(xué)習(xí)好C語(yǔ)言,對(duì)于深入學(xué)習(xí)計(jì)算機(jī)科學(xué)的其他課程都是很有好處的。圖1.4C語(yǔ)言的主要特點(diǎn)常用工具軟件有一次,我打開電視機(jī)準(zhǔn)備隨便看看,無(wú)意中被一部戰(zhàn)爭(zhēng)片吸引住了。成千上萬(wàn)的戰(zhàn)士搭起云梯,想攻破一座城池。但是城樓上面的敵人負(fù)隅頑抗,拼了命地阻擊進(jìn)攻。雙方的傷亡都很慘重,但城就是攻不下來(lái)。眼看剩下的人不多了,突然不知從什么地方開出一輛坦克,兩炮就把城門轟開了。戰(zhàn)士們趁勢(shì)攻入城中,將敵人全部殲滅了。這類電視劇比較常見,相信大家看了不止一次。但是,我看完之后,那個(gè)場(chǎng)景還一直留在我的腦海里。成千上萬(wàn)的人不如一輛坦克來(lái)得直接,說(shuō)明了什么問(wèn)題呢?我立馬想到了一句俗語(yǔ):工欲善其事,必先利其器。的確,工具對(duì)于軟件開發(fā)工程師來(lái)說(shuō),真的是很重要。好的工具能夠提高開發(fā)的效率,進(jìn)而縮短產(chǎn)品的研發(fā)周期。那么,在實(shí)際的軟件研發(fā)項(xiàng)目中,軟件開發(fā)工程師常用的工具軟件有哪些呢?MicrosoftVisualStudio/MicrosoftVisualC++6.0MicrosoftVisualStudio(VS)是美國(guó)微軟公司的開發(fā)工具包系列產(chǎn)品。它是一個(gè)較為完整的開發(fā)工具集,包括了整個(gè)軟件生命周期中所需要的大部分工具,如集成開發(fā)環(huán)境(IDE)等。MicrosoftVisualC++6.0(VC或者VC6.0),是微軟推出的一款C++編譯器,將“高級(jí)語(yǔ)言”(如C、C++等)翻譯為“機(jī)器語(yǔ)言”的程序。它是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具,已成為大多數(shù)專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具之一?,F(xiàn)在的最新版C++編譯器集成在MicrosoftVisualStudio2015軟件里面。用MicrosoftVisualC++6.0軟件打開的代碼如圖1.5所示。圖1.5 用MicrosoftVisualC++6.0軟件打開的代碼鑒于使用MicrosoftVisualStudio/MicrosoftVisualC++6.0進(jìn)行軟件開發(fā)的人員很多,有熱心人士為其開發(fā)了一款叫做VisualAssistX的插件。VisualAssistX是一款非常好的MicrosoftVisualStudio/MicrosoftVisualC++6.0插件,支持C、C++、Java等語(yǔ)言,能夠自動(dòng)識(shí)別各種關(guān)鍵字、系統(tǒng)函數(shù)、成員變量,同時(shí)能夠自動(dòng)給出輸入提示、標(biāo)示錯(cuò)誤、更正大小寫錯(cuò)誤等,有助于提高開發(fā)效率。SourceInsightSourceInsight是一個(gè)面向項(xiàng)目開發(fā)的程序編輯器和代碼瀏覽器,它擁有內(nèi)置的對(duì)C、C++、Java等程序的分析。它能夠分析你的源代碼,并自動(dòng)為你顯示有用的上下文信息。SourceInsight不僅是一個(gè)強(qiáng)大的程序編輯器,還提供了最快速的對(duì)源代碼的導(dǎo)航信息。該工具被視為如今最好用的語(yǔ)言編輯器之一。用SourceInsight軟件打開的代碼如圖1.6所示。圖1.6 用SourceInsight軟件打開的代碼Notepad++Notepad++是一款很有特色的Windows環(huán)境下免費(fèi)開源的代碼編輯器。除了可以用來(lái)制作一般的純文字說(shuō)明文件之外,也十分適合用作代碼程序的編輯器。Notepad++極具特色的一個(gè)功能就是語(yǔ)法的高亮度顯示,方便了對(duì)關(guān)鍵詞語(yǔ)的閱讀。它支持的語(yǔ)言包括C、C++、Java等。用Notepad++軟件打開的代碼如圖1.7所示。圖1.7 用Notepad++軟件打開的代碼AraxisMerge/BeyondCompareAraxisMerge當(dāng)程序代碼比較多(成千上萬(wàn)行)的時(shí)候,我們想要了解最新代碼與之前某個(gè)時(shí)期的代碼的不同之處,并不是一件容易的事情。這樣,代碼比較工具就應(yīng)運(yùn)而生了。AraxisMerge和BeyondCompare是兩款用得較多的代碼比較工具。AraxisMerge是一個(gè)可視化的文件比較、合并和同步的軟件,能夠方便地被軟件工程師用于快速精確地比較不同版本的源文件。此外,它還能被用于進(jìn)行版本和質(zhì)量控制。用AraxisMerge軟件進(jìn)行代碼比較如圖1.8所示。BeyondCompareBeyondCompare是一套由ScooterSoftware推出的軟件,主要用于文件之間的比較。對(duì)于軟件開發(fā)工程師來(lái)說(shuō),它可以用來(lái)發(fā)現(xiàn)不同版本代碼或文檔的不同,使用起來(lái)非常方便。圖1.8 用AraxisMerge軟件進(jìn)行代碼比較用BeyondCompare軟件進(jìn)行代碼比較如圖1.9所示。圖1.9 用BeyondCompare軟件進(jìn)行代碼比較Evernote(印象筆記)Evernote(印象筆記)是2012年5月10日由Evernote公司推出的一款產(chǎn)品,具有儲(chǔ)存重要資料、剪輯網(wǎng)頁(yè)、圖片搜索等功能。對(duì)于軟件開發(fā)工程師來(lái)說(shuō),Evernote可用于記錄閱讀過(guò)的重要技術(shù)書籍的筆記、在工作過(guò)程中的一些想法,以及軟件實(shí)踐或論文等。Evernote軟件的界面如圖1.10所示。圖1.10 Evernote軟件的界面FTP工具(如FileZilla等)在工作過(guò)程中,我們會(huì)不時(shí)地需要用FTP工具來(lái)上傳或下載一些東西。FileZilla是軟件開發(fā)工程師用得較多的FTP工具之一。FileZilla是一款免費(fèi)的、開源的FTP軟件,分為客戶端版本和服務(wù)器版本兩種。它具備所有的FTP軟件功能,使用起來(lái)非常方便、快捷,曾在2002年11月獲選為當(dāng)月最佳推薦專案。FileZilla軟件的操作界面如圖1.11所示(在使用的時(shí)候,需要輸入正確的主機(jī)IP地址、用戶名和密碼,端口號(hào)一般使用默認(rèn)的21)。圖1.11 FileZilla軟件的操作界面UltraEdit在實(shí)際的軟件開發(fā)過(guò)程中,UltraEdit也是一款經(jīng)常會(huì)使用到的工具軟件。它是一款功能十分強(qiáng)大的文本編輯器,可以用于編輯文本、十六進(jìn)制、ASCII碼等。當(dāng)然,用它來(lái)編寫C/C++代碼也是十分方便的。用UltraEdit軟件打開代碼之后的界面如圖1.12所示。好的工具對(duì)于軟件開發(fā)工程師來(lái)說(shuō),就像優(yōu)良的戰(zhàn)斗武器對(duì)于戰(zhàn)士一樣重要。善于利用優(yōu)秀的工具,可節(jié)省開發(fā)時(shí)間、提高我們辦事的效率,進(jìn)而提高軟件產(chǎn)品的質(zhì)量。因此,掌握一些常用軟件的使用方法是非常重要的。圖1.12 用UltraEdit軟件打開代碼小結(jié)本章對(duì)C語(yǔ)言的發(fā)展歷史、C語(yǔ)言的主要特點(diǎn),以及軟件開發(fā)工程師常用到的工具軟件進(jìn)行了詳細(xì)的介紹。本章對(duì)后續(xù)章節(jié)起到了一個(gè)拋磚引玉的作用。第2章學(xué)校到職場(chǎng)踏出校門,對(duì)于我們整個(gè)學(xué)習(xí)生涯來(lái)說(shuō),只是“萬(wàn)里長(zhǎng)征走出了第一步”。為了使得之后學(xué)習(xí)和工作的道路走得更加順暢,我們需要認(rèn)清自身所學(xué)知識(shí)的不足,我們需要破除一些有關(guān)軟件開發(fā)的錯(cuò)誤觀念,我們更需要在學(xué)校里面就未雨綢繆地開始培養(yǎng)工作所需的一些技能。認(rèn)清自身不足我在走出校門的時(shí)候非?!拜p狂”,認(rèn)為自己在學(xué)校里面已經(jīng)學(xué)得夠多了,工作就只是“小菜一碟”。但在工作中屢次碰壁之后,我才發(fā)現(xiàn)自己當(dāng)時(shí)的很多想法都是不成熟的。我們踏上工作崗位,一切幾乎都要從零開始。對(duì)于大家“非常熟悉”的C語(yǔ)言來(lái)說(shuō),我們?cè)趯W(xué)校里面學(xué)到的只是皮毛,遠(yuǎn)遠(yuǎn)不能滿足實(shí)際軟件開發(fā)工作的要求。我們?cè)趯W(xué)校里面學(xué)到的典型的C語(yǔ)言程序如下:#include<stdio.h>voidmain(){floatfac(intn);intn;floaty;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%10.0f\n",n,y);}floatfac(intn){floatf;if(n<0){}

printf("n<0,dataerror!");if(n==0||n==1)f=1;f=fac(n-1)*n;return(f);}對(duì)于以上程序,至少存在如下幾個(gè)問(wèn)題。第一,變量命名不規(guī)范,而且沒有初始化。對(duì)于該程序,main函數(shù)里的變量n、y,fac函數(shù)里變量f的命名均不規(guī)范,不能讓人一眼就看出它是什么意思、要做什么操作。這對(duì)于一小段程序來(lái)說(shuō),影響還不是很大,但如果代碼行數(shù)達(dá)到數(shù)千行甚至上萬(wàn)行,那么閱讀起來(lái)就比較的費(fèi)力。另外,以上3個(gè)變量只是定義了,并沒有初始化,這在實(shí)際項(xiàng)目中也是不允許的。第二,函數(shù)的命名不規(guī)范,且沒有在主函數(shù)開始之前進(jìn)行聲明。本程序中的fac函數(shù)要做什么操作?通過(guò)閱讀代碼,我們知道該函數(shù)的功能是計(jì)算一個(gè)整數(shù)的階乘。在實(shí)際項(xiàng)目數(shù)調(diào)用者的內(nèi)部來(lái)對(duì)被調(diào)函數(shù)進(jìn)行聲明,而是將聲明放在外部,最好新建一個(gè)頭文件(.h文件)來(lái)對(duì)程序里出現(xiàn)的函數(shù)進(jìn)行聲明。第三,程序代碼排版不工整,“if…else”語(yǔ)句書寫不規(guī)范。在fac函數(shù)中,代碼的排版不工整。第一個(gè)if語(yǔ)句下面的大括號(hào)應(yīng)該與“if”關(guān)鍵字保持在同一列上,第二個(gè)“else”關(guān)鍵字應(yīng)該與第二個(gè)“if”關(guān)鍵字保持在同一列上,“f=1;”和“f=fac(n-1)*n;”應(yīng)該再縮進(jìn)4個(gè)空格。另外,“if”和“else”關(guān)鍵字下面的執(zhí)行語(yǔ)句不管有多少行,都應(yīng)該用“{}”括起來(lái),以方便閱讀。第四,程序注釋過(guò)少,函數(shù)開頭沒有注釋。一般說(shuō)來(lái),在程序的關(guān)鍵語(yǔ)句的前面或右邊,都應(yīng)該添加適當(dāng)?shù)淖⑨?,這對(duì)程序的理解有輔助的作用。函數(shù)fac的前面應(yīng)該加注釋,說(shuō)明此函數(shù)的功能、輸入/輸出參數(shù)、返回值、修改記錄等。在整個(gè)程序的開頭也要添加版本信息、修改記錄等注釋信息,以方便日后查閱。第五,程序中出現(xiàn)了“printf”、“scanf”和“main”函數(shù)。這是大家都習(xí)以為常的,但在實(shí)際的項(xiàng)目中,幾乎不可能出現(xiàn)這3個(gè)函數(shù)。因?yàn)楹芏喙径加凶约旱拈_發(fā)平臺(tái),而且代碼都達(dá)到數(shù)千行,甚至上萬(wàn)行,再加上大部分都不是基于VC開發(fā)的,你在哪里去輸入,又在哪里去看輸出呢?我一進(jìn)公司,最開始看到程序,就想去找“printf”、“scanf”和“main”,但這是徒勞的,因?yàn)楦揪蜎]有。關(guān)于輸入/輸出,開發(fā)中會(huì)有專門的消息處理流程來(lái)處理,大家需要知道的就是一個(gè)完整的代碼工程中不一定非要有上面的3個(gè)函數(shù)(但本書為了給大家介紹C語(yǔ)言的相關(guān)知識(shí),在程序仍然使用這3個(gè)函數(shù))。短短的幾十行代碼,就出現(xiàn)了這么多大家“沒有想到”的問(wèn)題。看到以上的分析,也許你會(huì)很驚慌:我以前的C語(yǔ)言難道是白學(xué)了?非也!我舉這個(gè)例子,不是為了給大家當(dāng)頭一棒,讓大家覺得軟件開發(fā)是多么高深和艱難。我只是想說(shuō)明,對(duì)于C語(yǔ)言,我們還有很多不知道的東西,即使是自己知道的,也與階段,而后才逐漸去改變了自己“根深蒂固”的觀念?!爸e(cuò)能改,善莫大焉”??!破除錯(cuò)誤觀念要讓我們做事情的能力能夠有所提升,觀念的轉(zhuǎn)變是關(guān)鍵。從學(xué)生轉(zhuǎn)變?yōu)槁殬I(yè)人的過(guò)程是很艱難的,因?yàn)槲覀円c自己積累了多年的“老毛病”作斗爭(zhēng),這些“老毛病”包括:做事拖拉、不守時(shí)、不遵守規(guī)則、怕吃苦等。就像發(fā)射火箭衛(wèi)星了。所謂“萬(wàn)事開頭難”,也就是這個(gè)道理。那么,要想掌握工作中C語(yǔ)言的基本技能,我們需要破除哪些錯(cuò)誤觀念呢?如圖2.1所示。圖2.1 我們需要破除的錯(cuò)誤觀念錯(cuò)誤觀念一:我的C語(yǔ)言學(xué)得很好。很多剛走出學(xué)校的、準(zhǔn)備從事軟件開發(fā)的人都持有這樣的觀念,因?yàn)樗麄冊(cè)趯W(xué)??荚嚩嫉昧烁叻?。但想法是美好的,現(xiàn)實(shí)是殘酷的。真正到了工作崗位,你就會(huì)發(fā)現(xiàn),自己在學(xué)校學(xué)的那些知識(shí)是十分有限的,根本不足以應(yīng)對(duì)工作。例如,C語(yǔ)言中的指針、結(jié)構(gòu)體、異常保護(hù)這些,學(xué)校里面講得很少或者不深入,大家也沒有太注意,只是應(yīng)付了考試,但工作中我們需要時(shí)時(shí)與它們打交道。你還說(shuō)自己學(xué)得好嗎?因此,為了個(gè)人的技術(shù)積累和職業(yè)發(fā)展,我們一定要謙虛,要虛心學(xué)習(xí)。錯(cuò)誤觀念二:編程是很簡(jiǎn)單的事情。持這種觀點(diǎn)的人,也是受到了學(xué)校教育的影響,因?yàn)闀旧厦娴拇a都很短,而且比較簡(jiǎn)單。但在工作中,也這么簡(jiǎn)單嗎?非也。我總結(jié)了一下,教材上的程序與實(shí)際工作中的程序至少有以下幾點(diǎn)不同。第一,代碼行數(shù)的多少。教材中的代碼一般為幾十行,多則一兩百行,大家當(dāng)然會(huì)覺得簡(jiǎn)單;而工作中的代碼少則幾千行,多則上萬(wàn)行,兩者根本不是同一個(gè)數(shù)量級(jí)的。我最開始拿到程序的時(shí)候,腦袋就暈了:怎么這么多代碼呢?我從沒看到過(guò)。第二,變量及函數(shù)的命名。這是兩者的最大不同,也是“專業(yè)”和“業(yè)余”的重要區(qū)別。在教材中,經(jīng)常的命名有這幾個(gè):“inti;”、“char*p;”、“floatf;”、“intf(inta,intb)”等,大家都已經(jīng)習(xí)以為常了。但變量及函數(shù)的命名不能想當(dāng)然。這在后續(xù)的章節(jié)中會(huì)有詳細(xì)的說(shuō)明。第三,程序的注釋。附近,一定要有注釋。不僅如此,注釋的寫法也有多種,在不同的地方,寫法是不一樣的。簡(jiǎn)短而清晰的注釋可以提高大家閱讀代碼的速度,進(jìn)而提高了工作效率。第四,輸入/輸出語(yǔ)句。在教材上,幾乎每個(gè)程序都有“scanf”和“printf”這兩個(gè)函數(shù),用于讀入和輸出數(shù)據(jù),大家用得是津津有味,如果哪個(gè)程序沒有這兩個(gè)函數(shù),反而會(huì)覺得奇怪。但在實(shí)際的項(xiàng)目代碼中,幾乎不存在這兩個(gè)函數(shù)的,而代之以其他方式來(lái)進(jìn)行輸入和輸出。在剛開始的時(shí)候,你也許會(huì)覺得難以接受,但慢慢熟悉之后,你就會(huì)知道這是什么原因了。第五,程序的樣式。解,認(rèn)為編程只注重功能,其他什么的都可以“隨心所欲”。但在工作中,對(duì)于程序的版式、布局都是有嚴(yán)格規(guī)定的,哪里應(yīng)該縮進(jìn)(以及縮進(jìn)幾個(gè)空格)里應(yīng)該留空行,都是要注意的。這就像一個(gè)人一樣,光說(shuō)自己肚子里“有貨”還不行,還需要注意外表,要讓大家看起來(lái)覺得很舒服,所謂的“內(nèi)外兼修”,就是這個(gè)道理。錯(cuò)誤觀念三:我只要把代碼寫好就行了,其他的就不用管了。大家也許會(huì)認(rèn)為,開發(fā)工程師只負(fù)責(zé)寫程序,其他的什么測(cè)試啊、寫文檔啊,就不必自己操心了。其實(shí)不然。在工作中,開發(fā)工程師的工作是很多的,編寫代碼只是一小部分。在編寫代碼之前,我們要對(duì)軟件進(jìn)行詳細(xì)設(shè)計(jì);在代碼寫完之后,不能馬上把它交給測(cè)試人員來(lái)測(cè)試。很多新手寫完代碼就了事,這是不對(duì)的。我們要首先進(jìn)行自測(cè),這會(huì)花費(fèi)比較長(zhǎng)的時(shí)間,甚至比寫代碼的時(shí)間還要長(zhǎng)很多,等自測(cè)無(wú)誤之后,才能正式提交。除了寫代碼和自測(cè),我們還要編寫相關(guān)的開發(fā)文檔。你也許會(huì)認(rèn)為寫文檔是文檔工程師的事情,非也,這是開發(fā)工程師要干的。另外,我們從開始寫代碼到最后提交,都要嚴(yán)格遵守項(xiàng)目的管理流程,不能放任自流,要在規(guī)則之下來(lái)做事情。錯(cuò)誤觀念四:公司會(huì)安排好我的職業(yè)道路。每個(gè)人進(jìn)入公司,都會(huì)有相應(yīng)的入職培訓(xùn),這其實(shí)就是公司對(duì)應(yīng)屆畢業(yè)生進(jìn)行所謂的“洗腦”的過(guò)程。培訓(xùn)老師會(huì)給大家講,公司是多么多么好,公司會(huì)針對(duì)每個(gè)員工制定好培養(yǎng)計(jì)劃,讓大家在適合自己的職業(yè)軌道上發(fā)展。但是,當(dāng)你發(fā)現(xiàn)坐在你旁邊的員工已經(jīng)入職10年,可是還做著和你一樣的工作時(shí),你對(duì)公司美好的幻想瞬間就破滅了。確實(shí),不管是在學(xué)校,還是在工作單位,我們不要指望學(xué)?;蚬灸軌?qū)⑽磥?lái)的道路給安排好,而要靠自己不斷地努力去實(shí)現(xiàn)自身的價(jià)值??茖W(xué)技術(shù)日新月異,新的軟件開發(fā)技術(shù)層出不窮。從事軟件開發(fā)這一行,我們就要馬不停蹄地學(xué)習(xí),任何寄希望于他人或公司的想法都是不可取的?!澳サ恫徽`砍柴工”,在樹立了正確的觀念之后,我們學(xué)習(xí)工作中的C語(yǔ)言就容易多了。工作所需軟技能的培養(yǎng)在新員工剛進(jìn)入公司的時(shí)候,一般都會(huì)有一段時(shí)間的試用期,也叫做培訓(xùn)期。對(duì)于大部分IT企業(yè)來(lái)說(shuō),這個(gè)試用期大體分為3個(gè)階段:第一階段,企業(yè)文化、辦事流程、公司業(yè)務(wù)范圍等的培訓(xùn);第二階段,工作所需專業(yè)知識(shí)的培訓(xùn);第三階段叫做“以師帶徒”,也就是由一位老員工帶著來(lái)從事具體的開發(fā)工作。但是,我們不能奢望通過(guò)這個(gè)短短的培訓(xùn)期就能夠?qū)⒐ぷ髦兴璧募寄苋空莆?,因?yàn)閷W(xué)習(xí)重在長(zhǎng)期的積累,個(gè)人習(xí)慣的改變更是一個(gè)漫長(zhǎng)而痛苦的過(guò)程。這就需要我們?cè)趯W(xué)校里面就有目的性地培養(yǎng)工作所需的方方面面的東西??偟恼f(shuō)來(lái),工作所需的一些軟技能(即除專業(yè)技能之外的一些影響個(gè)人工作和發(fā)展的技能)如圖2.2所示。圖2.2 工作所需的一些軟技能那么,我們?nèi)绾卧趯W(xué)校里面有針對(duì)性地培養(yǎng)如圖2.2所示的各種能力呢?第一,對(duì)于實(shí)踐性較強(qiáng)的一些課程(如程序設(shè)計(jì)課程、算法課程、網(wǎng)絡(luò)課程、數(shù)據(jù)庫(kù)課程等),一定不能只求考試通過(guò),要多問(wèn)為什么、多動(dòng)手編寫程序。有一位學(xué)弟發(fā)來(lái)郵件向我咨詢一些問(wèn)題,其中有個(gè)問(wèn)題是這樣的:看書學(xué)技術(shù)的時(shí)候有時(shí)還是很有成就感的,特別是敲代碼實(shí)現(xiàn)一些小的算法的時(shí)候,感覺很舒服。但是看得時(shí)間長(zhǎng)了偶爾就會(huì)感覺枯燥,耐不住寂寞。想必很多人都有類似的感觸。我的答復(fù)是這樣的:如果你在學(xué)校寫點(diǎn)程序就會(huì)覺得枯燥的話,在工作中你會(huì)覺得更枯燥。如果你從事軟件開發(fā)工作,那么幾乎每天都要和程序打交道,需要相當(dāng)大的韌性才能堅(jiān)持得住。如何才能既學(xué)到技術(shù),又不感覺到枯燥呢?根據(jù)我個(gè)人的經(jīng)驗(yàn),可以參考圖2.3。圖2.3 一個(gè)學(xué)習(xí)的良性循環(huán)打個(gè)比方來(lái)說(shuō),你要學(xué)習(xí)C語(yǔ)言,那么首先要選一本好的參考書,對(duì)于書上的程序或課后的習(xí)題,你要親自敲到電腦里面來(lái)運(yùn)行。慢慢熟悉之后,你對(duì)編程會(huì)有一些心得體會(huì),這時(shí)你就可以將這些心得體會(huì)寫成博客發(fā)表出去。寫博客又會(huì)促使你去學(xué)習(xí)新的東西,別人的評(píng)論也會(huì)讓你受益。如此不斷地循環(huán)(根據(jù)個(gè)人的經(jīng)驗(yàn)這是一個(gè)良性循環(huán)),自身能力會(huì)不斷提高,你會(huì)發(fā)現(xiàn)學(xué)習(xí)技術(shù)是一件很有趣的事情。如果你覺得書本上的題目太簡(jiǎn)單,可以利用我們最強(qiáng)大的老師(網(wǎng)絡(luò))去尋找一些實(shí)際的軟件開發(fā)項(xiàng)目來(lái)做。此外,很多開源社區(qū)也是一個(gè)很不錯(cuò)的選擇。“問(wèn)渠那得清如許,為有源頭活水來(lái)”,我們只有不斷地輸入和輸出知識(shí),才能讓自身充滿活力。第二,適當(dāng)?shù)貐⒓右恍┥鐖F(tuán)活動(dòng)或集體活動(dòng),利用假期(如寒假或暑假)到外面去做兼職。末了。通過(guò)恰當(dāng)?shù)募媛毤吧鐖F(tuán)活動(dòng),我們不僅能夠?qū)W到一些書本上沒有的知識(shí)(夠看到書本知識(shí)在實(shí)際中的應(yīng)用),動(dòng)。第三,打好專業(yè)基礎(chǔ),在高年級(jí)的時(shí)候爭(zhēng)取能夠到企業(yè)里面去實(shí)習(xí)。絕大部分學(xué)生在學(xué)校學(xué)習(xí)的最終目的是就業(yè),也就是要走出校門,進(jìn)入企業(yè)。因此,如果你在畢業(yè)之前能夠有一段到企業(yè)里面去實(shí)習(xí)的經(jīng)歷,那么這必將豐富你的人生經(jīng)歷,讓你在畢業(yè)求職的路上快人一步。能夠去單位實(shí)習(xí),從側(cè)面來(lái)說(shuō)也是對(duì)你在校學(xué)習(xí)成果的一種認(rèn)可。因此,大家一定要將自己的專業(yè)課學(xué)好,讓企業(yè)認(rèn)為你是一個(gè)可以培養(yǎng)的人。通過(guò)一份比較有份量的實(shí)習(xí),我們不僅能夠?qū)W到專業(yè)知識(shí)、企業(yè)運(yùn)作流程,還能夠提高自己的動(dòng)手能力、表達(dá)能力、團(tuán)隊(duì)協(xié)作能力等,同時(shí)也可以為自己的簡(jiǎn)歷增加亮點(diǎn)。李開復(fù)老師也多次強(qiáng)調(diào)了大學(xué)生實(shí)習(xí)的重要性。小結(jié)本章作為一個(gè)過(guò)渡章節(jié),從認(rèn)清自身所學(xué)C語(yǔ)言知識(shí)的不足入手,接著讓大家破除幾個(gè)有關(guān)軟件開發(fā)的錯(cuò)誤觀念,然后讓在校學(xué)生有意識(shí)地培養(yǎng)工作所需的一些軟技能。認(rèn)清自身的不足讓人謙虛,破除錯(cuò)誤觀念讓人不惑,培養(yǎng)技能讓人信心百倍。現(xiàn)在,我們可以正式開啟軟件項(xiàng)目實(shí)踐中C語(yǔ)言的學(xué)習(xí)征程了。第3章 程序的樣式在《高質(zhì)量程序設(shè)計(jì)指南(C++/C語(yǔ)言)》中,作者說(shuō):可以把程序的版式比喻為“書法”,好的“書法”先看到的便是程序的排版,我們的第一印象便是程序?qū)懙檬枪ふ€是凌亂。都說(shuō)第一印象很重要,為了給大家留下好的第一印象,我們一定要注重程序的版式。此外,好的注釋能夠幫助讀者更快地理解程序,提高工作效率。也許是因?yàn)楣ぷ鞅容^忙的緣故,很多軟件工程師不喜歡為自己的程序?qū)懽⑨?,認(rèn)為這樣做是沒有必要的。那么,如果給他一份毫無(wú)注釋的代碼,他會(huì)有什么樣的感受呢?在程序中,優(yōu)美的、得當(dāng)?shù)淖⑨屇軌蚱鸬藉\上添花的作用,更能夠體現(xiàn)出一個(gè)工程師的專業(yè)素質(zhì)。因此,寫注釋實(shí)在是很有必要的。本章介紹頭文件、源文件(也被稱作定義文件)的樣式,空格、空行、大括號(hào)的使用和注釋的書寫。本章中的示例代碼均是基于開發(fā)項(xiàng)目實(shí)踐中的編碼規(guī)范來(lái)編寫的。頭文件頭文件起到一個(gè)輔助的作用,簡(jiǎn)要地反應(yīng)出本程序的基本功能。采用以下的樣式來(lái)書寫頭文件:/***************************************************************版權(quán)所有(C)2015,公司(或個(gè)人)名稱。*文件名稱:內(nèi)容摘要:其他說(shuō)明:當(dāng)前版本:作 者:完成日期:*修改記錄1:修改日期:修改內(nèi)容:*修改記錄2:修改日期:修改內(nèi)容:#ifndef_XXX_H //防止頭文件被重復(fù)引用#define_XXX_H/**************************************************************相關(guān)宏定義**************************************************************//**************************************************************相關(guān)結(jié)構(gòu)體定義**************************************************************//**************************************************************源程序中出現(xiàn)的函數(shù)聲明#endif說(shuō)明:在頭文件開始的地方,一定要有注釋。這里的注釋主要是版權(quán)、版本、作者等相關(guān)在單位為軟件產(chǎn)品寫的每一行代碼都要有版權(quán)聲明,這也是對(duì)一個(gè)職業(yè)人的基本要求。的。為了便于理解,我們會(huì)將很多諸如數(shù)字等信息用宏來(lái)代替,就像C語(yǔ)言課上我們用“PI”來(lái)代表圓周率的值一樣。此時(shí),就需要在頭文件中對(duì)源文件中需要用到的宏進(jìn)行定義,并給出適當(dāng)?shù)淖⑨?,方便理解。在?shí)際的C語(yǔ)言程序中,結(jié)構(gòu)體是經(jīng)常會(huì)用到的。例如,某個(gè)消息結(jié)構(gòu)體包含了很的所有結(jié)構(gòu)體。在學(xué)校里,很多人都不習(xí)慣對(duì)函數(shù)進(jìn)行聲明。為了防止函數(shù)在沒有定義之前就被引數(shù)后面一定要寫上恰當(dāng)?shù)淖⑨?。源文件源文件文件是程序的核心,所有的工作都是在該文件里面完成的。采用以下的樣式?lái)書寫源文件:/***************************************************************版權(quán)所有(C)2015,公司(或個(gè)人)名稱。*文件名稱:內(nèi)容摘要:其他說(shuō)明:當(dāng)前版本:作 者:完成日期:*修改記錄1:修改日期:修改內(nèi)容:*修改記錄2:修改日期:修改內(nèi)容:***************************************************************//**************************************************************頭文件引用**************************************************************//**************************************************************全局變量定義**************************************************************//**************************************************************函數(shù)實(shí)現(xiàn)**************************************************************/說(shuō)明:函數(shù)頭部的版權(quán)、版本、作者等相關(guān)的信息與頭文件的類似,也是必不可少的。函數(shù)包括進(jìn)來(lái)。怎么辦呢?辦法就是引用定義這些函數(shù)的頭文件,像我們很熟悉的“#include<stdio.h>”。當(dāng)源程序中的函數(shù)比較多時(shí),會(huì)出現(xiàn)很多函數(shù)都需要使用同一個(gè)變量的情況,這就何?函數(shù)是程序的核心,我們開頭做了那么多的工作,都是為實(shí)現(xiàn)函數(shù)功能服務(wù)的。那部的注釋可采用如下的樣式:/**********************************************************************功能描述:輸入?yún)?shù):輸出參數(shù):其他說(shuō)明:修改日期 版本號(hào) 修改人 修改內(nèi)容* YYYYMMDD XXX Name YYY***********************************************************************/“YYYYMMDD”表示“年月日”,“XXX”是創(chuàng)建或修改函數(shù)時(shí)的版本號(hào),“Name”是函數(shù)創(chuàng)建或修改人的名字,“YYY”是對(duì)函數(shù)修改內(nèi)容的簡(jiǎn)要描述(如果該函數(shù)是第一次創(chuàng)建,那么“YYY”就可以寫成“創(chuàng)建”)。在實(shí)際的開發(fā)工作中,很多軟件程序都比較復(fù)雜,其中涉及的宏定義、結(jié)構(gòu)體、函數(shù)等非常多,大家一定要按照規(guī)范的頭文件及源文件的樣式來(lái)書寫程序,以利于代碼的閱讀及后期維護(hù)。本書中的大部分示例程序針對(duì)的是具體的知識(shí)點(diǎn),因此與實(shí)際開發(fā)工作中的很多程序相比,要簡(jiǎn)單很多。為了便于說(shuō)明,本書大部分示例程序都以源文件的形式呈現(xiàn),文件中代碼布局的先后順序?yàn)椋何募f(shuō)明、頭文件引用、數(shù)據(jù)類型或結(jié)構(gòu)體定義、函數(shù)聲明、函數(shù)實(shí)現(xiàn)??崭窈涂招性诔绦虼a中,如果善用空格和空行,可使程序的版式更加的優(yōu)美。本小節(jié)說(shuō)明空格和空行的使用方法。空格在C語(yǔ)言的關(guān)鍵字(像if、for、while、switch等)之后要留有空格,以突出該關(guān)鍵字;在函數(shù)名之后不要留空格,緊跟左括號(hào)“(”間,要留有空格,如Function(x,y,z)。賦值操作符、算術(shù)操作符、比較操作符、邏輯操作符、位域操作符等,如“=”、“+=”、“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后應(yīng)當(dāng)加空格。但一元操作符如“!”、“~”、“++”、“??”、“&”(地址運(yùn)算符)等前后不加空格。在一行代碼的結(jié)尾之后不要留空格。在代碼中,使用空格進(jìn)行縮進(jìn)(一般縮進(jìn)為4個(gè)空格),不要使用制符表(即Tab鍵來(lái)縮進(jìn)??招锌招衅鹬指舫绦蚨温涞淖饔?,適當(dāng)?shù)目招袑⑹钩绦虻牟季指忧逦T诿總€(gè)函數(shù)定義結(jié)束之后都要加空行(兩個(gè)函數(shù)之間建議添加兩個(gè)以上的空行)。隔關(guān)系不是很大的代碼段。大括號(hào)在C語(yǔ)言中,大括號(hào)“{}”是一類比較特殊的符號(hào)。如果能夠在適當(dāng)?shù)牡胤嚼盟?,可使代碼看起來(lái)非常整潔,也能夠從側(cè)面看出一個(gè)編程人員的專業(yè)素養(yǎng)。那么,在C語(yǔ)言中,大括號(hào)應(yīng)該用在哪些地方呢?初始化數(shù)組變量在實(shí)際的軟件開發(fā)項(xiàng)目中,變量在使用前應(yīng)初始化,防止未經(jīng)初始化的變量被引用。對(duì)于數(shù)組變量來(lái)說(shuō),恰當(dāng)?shù)某跏蓟瘶永缦拢篶harszString[100]={0};定義了一個(gè)名為szString的包含100個(gè)字節(jié)的數(shù)組變量,并將該數(shù)組中每個(gè)變量的初始值賦為0。定義和初始化結(jié)構(gòu)體變量結(jié)構(gòu)體變量的定義方法樣例如下:typedefstruct{……}T_Struct;該結(jié)構(gòu)體變量的初始化樣例如下:T_StructtStruct={0};很多開發(fā)人員都不注重對(duì)結(jié)構(gòu)體變量進(jìn)行初始化,這是不對(duì)的。要牢記的是,任何變量在使用前,都應(yīng)進(jìn)行初始化。用在if、else、elseif、for、while、do等語(yǔ)句中在實(shí)際的軟件開發(fā)項(xiàng)目中,if、else、elseif、for、while、do等語(yǔ)句用得較多,對(duì)這些語(yǔ)句的書寫要求如下。自占一行,執(zhí)行語(yǔ)句不得緊跟其后。不論執(zhí)行語(yǔ)句有多少都要加這樣做的目的是便于閱讀,同時(shí)也有利于代碼的維護(hù)。假設(shè)定義了兩個(gè)整型變量iIntVal1和iIntVal2,如果iIntVal1的值小于iIntVa2,那么就將iIntVal2的值賦給iIntVal1,則正反示例為:反例:if(iIntVal1<iIntVal2)iIntVal1=iIntVal2;這樣寫出來(lái)的程序可讀性很差,不利于對(duì)流程的跟蹤及對(duì)版本的維護(hù)。正例:if(iIntVal1<iIntVal2){iIntVal1=iIntVal2;}該代碼和反例中的代碼相比,簡(jiǎn)潔清晰,讓人一目了然。程序的分界符“{”和“}”齊。之內(nèi)的代碼塊使用縮進(jìn)規(guī)則對(duì)齊(一般縮進(jìn)4個(gè)空格)。同樣以兩個(gè)整型變量iIntVal1和iIntVal2的比較來(lái)說(shuō)明,正例如上面(1)所示。反例:if(iIntVal1<iIntVal2){iIntVal1=iIntVal2;}該代碼看起來(lái)給人一種很凌亂的感覺,不便于閱讀和維護(hù)。用在switch語(yǔ)句中switch語(yǔ)句也經(jīng)常出現(xiàn)在產(chǎn)品代碼中,要想寫出邏輯清晰、可閱讀性強(qiáng)的switch語(yǔ)句,需要遵循以下規(guī)則。一定要加上default分支,即使case分支已經(jīng)將全部情況都包括了。這樣做是為了防止其他代碼閱讀者誤以為漏寫了default分支,也可表現(xiàn)出開發(fā)人員思維的全面性。一個(gè)case分支和default分支要用括起來(lái),中的內(nèi)容需要縮進(jìn)(一般縮進(jìn)4個(gè)空格)。這樣做可使程序邏輯清晰,可讀性更好。假設(shè)定義了一個(gè)整型變量iSwitchFlag,可取值1、2、3,用switch語(yǔ)句對(duì)每種可取值的情況分別進(jìn)行處理,則正反示例為:反例:switch(iSwitchFlag){ //“{”沒有和switch對(duì)齊case1: //“case”沒有縮進(jìn){ //“{”沒有和case對(duì)齊DoSomething1(); //縮進(jìn)空格數(shù)太多break; //“break;”沒有和上一條語(yǔ)句對(duì)齊} //“}”沒有和本case語(yǔ)句的“{”對(duì)齊case2:{DoSomething2();break;}case3:DoSomething3(); //沒有用“{}”將語(yǔ)句括起來(lái),且case執(zhí)行結(jié)束后無(wú)break;//缺少了default分支}以上反例中的switch語(yǔ)句可讀性很差,不利于代碼的維護(hù)。正例:switch(iSwitchFlag){case1:{DoSomething1(); //縮進(jìn)4個(gè)空格break;}case2:{DoSomething2(); //縮進(jìn)4個(gè)空格break;}case3:{DoSomething3(); //縮進(jìn)4個(gè)空格break;}default: //一定要有default分支{DoNothing();break;}}正例中的代碼邏輯清晰,有利于代碼的修改和維護(hù)。break語(yǔ)句要寫到“{}”如下的代碼是不規(guī)范的:switch(iSwitchFlag){case1:{DoSomething1();}break; //break語(yǔ)句放到了“{}”外面,不規(guī)范case2:{DoSomething2();}break;case3:{DoSomething3();}break;default:{DoNothing();}break;}用在函數(shù)中大家都知道,一個(gè)函數(shù)中的所有語(yǔ)句是包括在“{}”之中的。除此之外,“{}”在函數(shù)之中還有其他用武之地。分隔功能關(guān)聯(lián)不大的語(yǔ)句塊在某些函數(shù)中,可能包含了很多功能,但這些功能之間的關(guān)聯(lián)性很小,可以當(dāng)作獨(dú)立的代碼來(lái)對(duì)待。這時(shí),可以用“{}”將這些不同功能的代碼塊區(qū)分開來(lái),增強(qiáng)代碼的可讀性,也便于對(duì)函數(shù)的維護(hù)和修改。假設(shè)有一個(gè)函數(shù)ExampleFun,包含了3個(gè)較為獨(dú)立的功能A、B和C,則可以如下組織該函數(shù)的代碼。voidExampleFun(void){//功能A代碼塊開始{//功能A的實(shí)現(xiàn)代碼}//功能A代碼塊結(jié)束//功能B代碼塊開始{//功能B的實(shí)現(xiàn)代碼}//功能B代碼塊結(jié)束//功能C代碼塊開始{//功能C的實(shí)現(xiàn)代碼}//功能C代碼塊結(jié)束}這樣的代碼具有自說(shuō)明性,便于閱讀和維護(hù)。突出添加或修改的代碼在代碼行數(shù)較多的函數(shù)中,如果要添加或修改的代碼量很少,即與原本已有的代碼比起來(lái),顯得“很渺小”。這時(shí),可以用“{}”方便閱讀及對(duì)代碼進(jìn)行走查等。同樣以函數(shù)ExampleFun為例來(lái)說(shuō)明,如下所示:voidExampleFun(void){…………//修改或添加代碼塊開始{//修改或添加的代碼}//修改或添加代碼塊結(jié)束…………}這樣,不管是代碼編寫者,還是代碼閱讀者,都很容易發(fā)現(xiàn)代碼的改動(dòng),閱讀或維護(hù)起來(lái)也比較的容易。總的說(shuō)來(lái),善于在代碼中運(yùn)用“{}”,可以使得程序的樣式更加美觀。這樣也可以增強(qiáng)代碼的規(guī)范性,進(jìn)而提高代碼質(zhì)量及工作的效率。注釋在程序中,注釋并非可有可無(wú),軟件開發(fā)人員應(yīng)該將注釋置于與代碼等同的地位上。那么,如何正確書寫注釋呢?在C語(yǔ)言程序中,注釋的書寫有兩種方式,一種是用“//”來(lái)標(biāo)注,一種是用“/…/”來(lái)標(biāo)書寫,或?qū)Χ嘈写a進(jìn)行添加、刪除時(shí),可以采用第二種方式。方。閱讀和理解。要盡量避免在注釋中使用縮寫,特別是不常用的縮寫,以讓人產(chǎn)生疑惑。性。如果注釋不再有用,那么要?jiǎng)h除掉。巧妙或復(fù)雜的代碼段前要添加注釋,比較隱晦的地方要在代碼適當(dāng)?shù)奈恢锰砑幼⑨?。到底是使用中文還是英文對(duì)代碼進(jìn)行注釋呢?對(duì)于常用的代碼編輯器(如SourceInsight、MicrosoftVisualStudio等)來(lái)說(shuō),中英文的注釋均能夠正確顯示。因此,書寫注釋要遵循“內(nèi)容重于形式”的原則,要在恰當(dāng)?shù)牡胤绞褂们‘?dāng)?shù)淖⑨?。小結(jié)本章從程序給人的第一印象入手,介紹了頭文件和源文件的樣式、空格、空行、大括號(hào)的使用和注釋的書寫。當(dāng)我們看到排版工整、注釋規(guī)范的代碼時(shí),會(huì)不自然地產(chǎn)生繼續(xù)讀下去的想法,這也在無(wú)形中提高了工作的效率。因此,注意程序的樣式是十分重要的。堅(jiān)持不懈地努力。廣大的軟件開發(fā)工程師在提高自己編程水平的同時(shí),也要注重編程規(guī)范,讓自己的代碼更易于閱讀和維護(hù)。第4章 變量和函數(shù)路人甲到電信營(yíng)業(yè)廳去交電話費(fèi),給營(yíng)業(yè)員說(shuō)要充50塊錢,那個(gè)營(yíng)業(yè)員問(wèn)了一句“Howmuch?”于是便以不是很流利的口語(yǔ)說(shuō)了一句“FiftyYUAN”。那個(gè)營(yíng)業(yè)員一頭霧水地看著他,說(shuō)道“電話號(hào)碼多少?”路人甲這才恍然大悟,原來(lái)是問(wèn)我電話號(hào)碼多少,而非多少錢。不要讓別人感到疑惑。這個(gè)原理同樣適用于軟件開發(fā)過(guò)程,適用于編寫代碼的過(guò)程。我們?cè)诰帉懗绦虻倪^(guò)程中,要保證自己寫的每一行代碼都表意準(zhǔn)確,讓別人一看就能夠明白,特別是對(duì)于變量和函數(shù)的命名。某些不規(guī)范的變量命名,諸如“inti,j;”、“charc;”等,嚴(yán)重影響了工作的效率。本章首先介紹實(shí)際軟件開發(fā)項(xiàng)目中的數(shù)據(jù)類型,然后介紹變量和函數(shù)的命名規(guī)范,最后介紹一類特殊變量——靜態(tài)變量的使用。數(shù)據(jù)類型大家都知道,要定義一個(gè)變量是很容易的。要定義整型變量,直接用“inti;”語(yǔ)句就可以了;要定義字符型變量,直接用“charc;”就可以了。確實(shí),這能夠達(dá)到定義變量的目的,但在實(shí)際工作中卻沒有這么簡(jiǎn)單。在實(shí)際工作中,我們需要對(duì)一些基本數(shù)據(jù)類型進(jìn)行重定義(規(guī)范化),才能夠滿足編程規(guī)范的要求,才能夠用于定義變量。本節(jié)以整型和字符型的重定義來(lái)進(jìn)行說(shuō)明。整型整型,以在內(nèi)存中占數(shù)據(jù)位數(shù)來(lái)劃分,包括短整型(shortint)、整型(int)和長(zhǎng)整型(longint);以有無(wú)符號(hào)來(lái)劃分,包括無(wú)符號(hào)整型(unsigned)和有符號(hào)整型(signed)。各類整型的重定義規(guī)則如圖4.1所示。圖4.1 各類整型的重定義規(guī)則從圖4.1可以看出,各類整型的重定義規(guī)則如下。對(duì)于無(wú)符號(hào)短整型,其重定義為:typedefunsignedshortintUINT16;對(duì)于有符號(hào)短整型,其重定義為:typedefsignedshortintINT16;對(duì)于無(wú)符號(hào)整型,其重定義為:typedefunsignedintUINT32;對(duì)于有符號(hào)整型,其重定義為:typedefsignedintINT32;對(duì)于無(wú)符號(hào)長(zhǎng)整型,其重定義為:typedefunsignedlongULONG;對(duì)于有符號(hào)長(zhǎng)整型,其重定義為:typedefsignedlongLONG;通過(guò)以上重定義之后,我們就可以用UINT16、INT16、UINT32、INT32、ULONG和LONG來(lái)代替相應(yīng)的整型類型了。這里拿UINT32來(lái)說(shuō)明:“U”代表“unsigned”,“INT”代表“int”,“32”表示“32位”,從這個(gè)定義一眼就可以看出這表示32位的無(wú)符號(hào)整型數(shù)據(jù)類型,如果要定義這樣的一個(gè)變量X,用“UINT32X;”語(yǔ)句就可以了。字符型在C語(yǔ)言中,字符型和整型可以相互轉(zhuǎn)換。因此,也可以用類似的辦法來(lái)重定義字符型。字符型分為有符號(hào)和無(wú)符號(hào)兩種類型,它們的重定義規(guī)則如圖4.2所示。圖4.2 各類字符型的重定義規(guī)則從圖4.2可以看出,各類字符型的重定義規(guī)則如下。對(duì)于無(wú)符號(hào)字符型,其重定義為:typedefunsignedcharUINT8;對(duì)于有符號(hào)字符型,其重定義為:typedefsignedcharINT8;由于一個(gè)字符型變量在內(nèi)存中占據(jù)一個(gè)字節(jié),因此可以用8位來(lái)表示。通過(guò)我們的重定義,也能夠很清楚地看出來(lái)。如果要定義一個(gè)無(wú)符號(hào)字符型變量Y,用“UINT8Y;”語(yǔ)句就可以了。在實(shí)際的開發(fā)項(xiàng)目中,其他數(shù)據(jù)類型的重定義也可以參照整型和字符型的重定義來(lái)完成。對(duì)基本數(shù)據(jù)類型進(jìn)行重定義也就是在進(jìn)行代碼編寫的規(guī)范化。在大型代碼文件中,按照這個(gè)規(guī)范編寫的程序閱讀起來(lái)比較方便,同時(shí)也易于理解,提高了工作效率,讓讀者一看到就覺得十分專業(yè)。此外,這樣做也會(huì)間接提升開發(fā)工程師在客戶心中的地位,能夠獲得他們比較好的評(píng)價(jià)。變量及函數(shù)函數(shù)是程序的核心,而變量又是函數(shù)的核心。程序的各種操作,其實(shí)就是對(duì)函數(shù)中變量進(jìn)行的操作。變量及函數(shù)命名規(guī)范與否,直接影響到了代碼的質(zhì)量。因此,對(duì)變量及函數(shù)進(jìn)行規(guī)范化的命名具有很重要的意義。本節(jié)以一個(gè)實(shí)際的例子來(lái)為大家展示如何命名變量和函數(shù)是恰當(dāng)?shù)?。這里用2.1節(jié)中出現(xiàn)的程序代碼為例,將該代碼按照編碼規(guī)范修改后,如下所示:/***************************************************************版權(quán)所有(C)2015,ZhouZhaoxiong。*文件名稱:example.c內(nèi)容摘要:用于示范變量和函數(shù)的規(guī)范化命名其他說(shuō)明:無(wú)當(dāng)前版本:V1.0作 者:周兆熊*完成日期:20150120****************************************************************/#include<stdio.h>typedefsignedintINT32; //重定義數(shù)據(jù)類型typedeffloat FLOAT; //重定義數(shù)據(jù)類FLOATProcessFactorial(INT32iInputValue); //函數(shù)聲明INT32main(void); //函數(shù)聲明/**********************************************************************功能描述:主函數(shù)輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)其他說(shuō)明:無(wú)修改日期 版本號(hào) 修改人 修改內(nèi)容* *20150120 V1.0 周兆熊 創(chuàng)建***********************************************************************/INT32main(void){INT32iInputValue =0;FLOATfResult =printf("inputanintegernumber:");scanf("%d",&iInputValue);fResult=ProcessFactorial(iInputValue); //調(diào)用求階乘的函數(shù)printf("%d!=%10.0f\n",iInputValue,fResult);return0;}/**********************************************************************功能描述:求一個(gè)數(shù)的階乘輸入?yún)?shù):iInputValue-輸入值輸出參數(shù):無(wú)返回值:求階乘后的結(jié)果其他說(shuō)明:無(wú)修改日期 版本號(hào) 修改人 修改內(nèi)容* *20150120 V1.0 周兆熊 創(chuàng)建***********************************************************************/FLOATProcessFactorial(INT32iInputValue){FLOATfResult =0.0;//先判斷輸入值是否小于0if(iInputValue<0){printf("iInputValue<0,dataerror!");return-1;}else{if(iInputValue==0||iInputValue==1)//0和1的階乘是1{fResult=1;}else{fResult=ProcessFactorial(iInputValue-1)*iInputValue;//執(zhí)行遞歸調(diào)用}return(fResult);}}該代碼和2.1節(jié)中的代碼相比,是不是有很大的不同?有關(guān)變量和函數(shù)的命名,我們要遵循以下原則。變量命名和函數(shù)命名應(yīng)具備描述性,不要過(guò)度縮寫。變量的命名應(yīng)該使用名詞,如fResult;函數(shù)的命名應(yīng)該使用“命令性”動(dòng)詞,如ProcessFactorial。不管是函數(shù)還是變量,它們的命名只有一個(gè)原則:讓讀者一眼就能夠看出它們表達(dá)的意思。如ProcessFactorial函數(shù),一看到它,就大概能夠明白這是在求階乘;iInputValue變量,表示輸入值;fResult的費(fèi)心解釋。為了讓讀者看到一個(gè)變量就知道其類型,在變量的最前面,通常會(huì)有一個(gè)標(biāo)識(shí)類型的字母。如iInputValue中的第一個(gè)字母“i”表示這是一個(gè)整型變量(“i”代表“int”),fResult中的第一個(gè)字母“f”表示這是一個(gè)浮點(diǎn)型變量(“f”代表“float”)。這樣做,也是為了更進(jìn)的時(shí)間,可謂是“大家皆方便”。函數(shù)的功能要單一,不要設(shè)計(jì)多用途的函數(shù);函數(shù)體的規(guī)模要小,將函數(shù)內(nèi)的代碼行數(shù)控制在項(xiàng)目規(guī)定的范圍之內(nèi)。此外,要盡量避免函數(shù)帶有“記憶”該產(chǎn)生相同的輸出。懂的代碼,不是好代碼,也無(wú)法體現(xiàn)出一個(gè)編程人員的水平。對(duì)于函數(shù)的調(diào)用,需要注意以下幾點(diǎn)。代碼檢查工具(如Pclint)是很容易發(fā)現(xiàn)的。如果確實(shí)需要傳入該參數(shù),可使用強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換。對(duì)于有返回值的函數(shù),盡量在被調(diào)用的時(shí)候?qū)Ψ祷刂颠M(jìn)行處理。在實(shí)際的軟件開發(fā)沒有對(duì)返回值進(jìn)行處理,這是不規(guī)范的。例如,定義一個(gè)返回整型值的函數(shù)ExampleFun,如下所示:intExampleFun(…){//執(zhí)行代碼return0;}而調(diào)用代碼如下:……ExampleFun(…);……沒有考慮到返回值。規(guī)范的做法是:同樣定義一個(gè)整型變量,用于表示該函數(shù)的返回值,如下代碼所示:intiRetVal=0;……iRetVal=ExampleFun(…);……很多開發(fā)人員認(rèn)為寫代碼很枯燥,其實(shí)不然。如果你每天寫出來(lái)的代碼排版不工整、變量和函數(shù)命名不規(guī)范,當(dāng)然會(huì)覺得枯燥。也許你昨天寫的代碼,今天就不知道它們是什么意思了。但如果你時(shí)刻牢記編程規(guī)則,寫出“自己能夠說(shuō)話的代碼”(即排版工整,變量和函數(shù)的命名很恰當(dāng)),那么你就不會(huì)覺得這份工作很枯燥,反而會(huì)覺得它很有趣。這可能就是所謂的“編程境界”吧。“熟能生巧”,只有通過(guò)不斷地練習(xí),我們才能夠懂得編寫代碼的訣竅,也才能夠?qū)懙贸龊玫?、高質(zhì)量的代碼。靜態(tài)變量及其應(yīng)用在實(shí)際的軟件開發(fā)中,有一類變量非常特殊,它就是靜態(tài)變量。該變量用關(guān)鍵字static進(jìn)行聲明,主要應(yīng)用于函數(shù)中。說(shuō)靜態(tài)變量特殊,是因?yàn)樵撟兞康闹稻哂小坝洃浶浴?,即本次函?shù)調(diào)用時(shí)使用的變量值是上一次函數(shù)執(zhí)行結(jié)束時(shí)該變量的值。該變量的重要用途之一便是生成唯一序列號(hào)。唯一序列號(hào)的形式為:“Time+N”。其中,“Time”表示時(shí)間,而“N”表示流水號(hào),其實(shí)就是一個(gè)靜態(tài)變量的值。每次調(diào)用序列號(hào)生成函數(shù)的時(shí)候,“N”的值都不同,這樣可以保證序列號(hào)的唯一性。以下代碼展示了唯一序列號(hào)的生成過(guò)程,其中序列號(hào)的樣式為:MMDDHHMISSXXXXXX(即“月日時(shí)分秒流水號(hào)”的形式)。/**********************************************************************版權(quán)所有(C)2014,ZhouZhaoxiong。*文件名稱:SerialNo.cpp文件標(biāo)識(shí):無(wú)內(nèi)容摘要:用于演示序列號(hào)的創(chuàng)建方法其他說(shuō)明:無(wú)當(dāng)前版本:V1.0作 者:周兆熊*完成日期:20141122**********************************************************************/#include<afxinet.h>//數(shù)據(jù)類型typedefunsignedchar UINT8;typedefunsignedchar typedefunsignedint UINT32;typedefsigned int INT32;//時(shí)間信息結(jié)構(gòu)體typedefstruct{UINT8 second; //0-59UINT8 minute; //0-59UINT8 hour; //0-23UINT8 day; //1-31UINT8 month; //1-12UINT16year; //1994-2099UINT8 week; //1-7UINT8 Count10ms; //0-99}ClockStruc;//函數(shù)聲明voidGetCurTime(ClockStruc*pCurrentTime); //獲取當(dāng)前時(shí)INT32CreateSerial(UINT8*pSerialID,UINT32iSerialSize);INT32main(void); //主函數(shù)/**********************************************************************功能描述:獲取當(dāng)前時(shí)間輸入?yún)?shù):無(wú)輸出參數(shù):pCurrentTime-當(dāng)前時(shí)間結(jié)構(gòu)體其他說(shuō)明:無(wú)修改日期 版本號(hào) 修改人 修改內(nèi)容* *20141122 V1.0 周兆熊 創(chuàng)建**********************************************************************/voidGetCurTime(ClockStruc*pCurrentTime){SYSTEMTIMEtCurrentTime;GetLocalTime(&tCurrentTime);pCurrentTime->month =(UINT8)tCurrentTime.wMonth;pCurrentTime->day =(UINT8)tCurrentTime.wDay;pCurrentTime->hour =(UINT8)tCurrentTime.wHour;pCurrentTime->minute =(UINT8)tCurrentTime.wMinute;pCurrentTime->second =(UINT8)tCurrentTime.wSecond;pCurrentTime->week =(UINT8)tCurrentTime.wDayOfWeek;if(pCurrentTime->week==0) //表示星期天{pCurrentTime->week=7;}}/**********************************************************************功能描述:創(chuàng)建序列號(hào)輸入?yún)?shù):iSerialSize-序列號(hào)長(zhǎng)度輸出參數(shù):pSerialID-序列號(hào)返回值:0-成功-1-失敗其他說(shuō)明:序列號(hào)的樣式:MMDDHHMISS_XXXXXX修改日期 版本號(hào) 修改人 修改內(nèi)容* *20141122 V1.0 周兆熊 創(chuàng)建***********************************************************************/INT32CreateSerial(UINT8*pSerialID,UINT32iSerialSize){ClockStruc tClock ={0};**static****UINT32****iTailNum**=**0**;if(NULL==pSerialID){printf("CreateSerial:inputparameterisNULL.\n");return-1;}GetCurTime(&tClock);_snprintf((char*)pSerialID,iSerialSize,"%02d%02d%02d%02d%02d_%06d",tClock.month,tClock.day,tClock.hour,tClock.minute,tClock.second,iTailNiTailNum++;if(iTailNum>999999){iTailNum=0;}return0;}/****************************************************************功能描述:主函數(shù)輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:0-執(zhí)行成功-1-執(zhí)行失敗其他說(shuō)明:無(wú)修改日期 版本號(hào) 修改人 修改內(nèi)容* *20141122 V1.0 周兆熊 創(chuàng)建****************************************************************/INT32main(void){UINT32iLoopFlag =0; //該變量用于表示循環(huán)標(biāo)志INT32iRetValue =0; //該變量用于表示調(diào)用CreateSerial函數(shù)返回的值UINT8szSerialID[50{0}; //該變量用于存放生成的序列號(hào)//生成10個(gè)序列號(hào),并打印出來(lái)for(iLoopFlag=0;iLoopFlag<10;iLoopFlag++){iRetValue=CreateSerial(szSerialID,sizeof(szSerialID));if(iRetValue!=0){printf("execCreateSerialfailed.\n");return-1;}printf("第%d個(gè)序列號(hào)為:%s\n",iLoopFlag+1,szSerialID);}return0;}程序的運(yùn)行結(jié)果如圖4.3所示。圖4.3 唯一序列號(hào)的生成結(jié)對(duì)于此示例程序,說(shuō)明如下:在實(shí)際軟件開發(fā)項(xiàng)目的程序中,生成序列號(hào)中的時(shí)間會(huì)有各種不同的樣式,如“YYYYMMDDHHMISS”(年月日時(shí)分秒)、“HHMISS”(時(shí)分秒)等,這要根據(jù)實(shí)際的軟件需求來(lái)決定。GetLocalTime函數(shù)來(lái)生成序列號(hào)中的時(shí)間,該函數(shù)用來(lái)獲取當(dāng)?shù)氐漠?dāng)前系統(tǒng)日期和時(shí)間。本程序中的流水號(hào)(即序列號(hào)中下劃線后面的部分)是用靜態(tài)變量iTailNum的。在調(diào)用CreateSerial函數(shù)的過(guò)程中,這個(gè)變量會(huì)不斷增長(zhǎng),在達(dá)到了最大值999999之后,又從0開始,如此周而復(fù)始。這樣設(shè)計(jì),確保了每一個(gè)序列號(hào)的唯一性。小結(jié)看過(guò)電視劇《楚漢傳奇》的人應(yīng)該對(duì)一個(gè)場(chǎng)面有印象。當(dāng)劉邦第一次去找項(xiàng)羽幫忙的時(shí)種差別移植到軟件開發(fā)上來(lái),就是“業(yè)余”與“專業(yè)”的差別。這個(gè)比喻雖然可能有點(diǎn)不恰業(yè)與否的表現(xiàn)。本章介紹了數(shù)據(jù)類型,變量和函數(shù)的命名規(guī)范及靜態(tài)變量的使用。掌握了這些基礎(chǔ)知識(shí)之后,我們才能夠更加深入地學(xué)習(xí)實(shí)際軟件開發(fā)項(xiàng)目中的C語(yǔ)言知識(shí)。第5章 內(nèi)存操作在實(shí)際的軟件開發(fā)項(xiàng)目中,內(nèi)存操作隨處可見,這也是程序編寫的難點(diǎn)所在。如果內(nèi)存操作處理不好,極易造成程序崩潰,并耗費(fèi)大量的時(shí)間來(lái)排查問(wèn)題。本章介紹4組與內(nèi)存操作相關(guān)的函數(shù)及其用法。這4組函數(shù)是:memset和memcpy、strcat和strncat、strcpy和strncpy、strcmp和strncmp。memset和memcpymemset函數(shù)原型voidmemset(voiddest,intc,size_tcount);函數(shù)作用在MSDN中,該函數(shù)的作用描述為:Setsbufferstoaspecifiedcharacter,即:將緩存設(shè)定為一個(gè)專門的字符。對(duì)照函數(shù)原型,就是將已開辟內(nèi)存空間dest的首count個(gè)字節(jié)的值設(shè)為c。示例代碼/***************************************************************版權(quán)所有(C)2014,ZhouZhaoxiong。*文件名稱:memset.c內(nèi)容摘要:用于測(cè)試memset函數(shù)其他說(shuō)明:無(wú)當(dāng)前版本:V1.0作 者:周兆熊*完成日期:20141121****************************************************************/#include<string.h>#include<stdio.h>typedefsignedcharINT8; //重定義數(shù)據(jù)類型typedefsignedintINT32; //重定義數(shù)據(jù)類型/**********************************************************************功能描述:主函數(shù)輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:0-執(zhí)行完成其他說(shuō)明:無(wú)修改日期 版本號(hào) 修改人 修改內(nèi)容* *20141121 V1.0 周兆熊 創(chuàng)建***********************************************************************/INT32main(void){INT8szTestStr[100]="AAAAAAAAAA";printf("Theoriginalstringis:%s\n",szTestStr);memset(szTestStr,'B',5); //調(diào)用memset函數(shù)printf("Thechangedstringis:%s\n",szTestStr);return0;}該程序的輸出結(jié)果如圖5.1所示。圖5.1 memset函數(shù)的示例程序輸出結(jié)該程序?qū)⒃址那?個(gè)字符設(shè)為B。重要應(yīng)用除了對(duì)指定位置設(shè)定值之外,該函數(shù)還可以用于內(nèi)存空間初始化、內(nèi)存復(fù)制、清空一個(gè)結(jié)構(gòu)類型的變量或數(shù)組等。memcpy函數(shù)原型voidmemcpy(voiddest,constvoid*src,size_tcount);函數(shù)作用在MSDN中,該函數(shù)的作用描述為:Copiescharactersbetweenbuffers,即:在緩存之間復(fù)制字符。對(duì)照函數(shù)原型,memcpy函數(shù)用來(lái)復(fù)制src所指的內(nèi)存內(nèi)容的前count個(gè)字節(jié)到dest所指的內(nèi)存地址上。示例代碼/***************************************************************版權(quán)所有(C)2014,ZhouZhaoxiong。*文件名稱:memcpy.c內(nèi)容摘要:用于測(cè)試memcpy函數(shù)其他說(shuō)明:無(wú)當(dāng)前版本:V1.0作 者:周兆熊*完成日期:20141121****************************************************************/#include<string.h>#include<stdio.h>typedefsignedcharINT8; //重定義數(shù)據(jù)類型typedefsignedintINT32; //重定義數(shù)據(jù)類型/**********************************************************************功能描述:主函數(shù)輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:0-執(zhí)行完成其他說(shuō)明:無(wú)修改日期 版本號(hào) 修改人 修改內(nèi)容* *20141121 V1.0 周兆熊 創(chuàng)建***********************************************************************/INT32main(void){INT8szTestStr[100]="AAAAAAAAAA";INT8szCopyStr[100]="BBBBBBBBBB";printf("Theoriginalstringis:%s\n",szTestStr);memcpy(szTestStr+1,szCopyStr+5,3); //調(diào)用memcpyprintf("Thechangedstringis:%s\n",szTestStr);return0;}該程序的輸出結(jié)果如圖5.2所示。圖5.2 memcpy函數(shù)的示例程序輸出結(jié)果該程序?qū)⒃址牡诙€(gè)到第四個(gè)字符設(shè)為B。重要說(shuō)明src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回值為指向dest的指針。在實(shí)際的開發(fā)項(xiàng)目中,memset與memcpy函數(shù)經(jīng)常同時(shí)使用,即先用memset函數(shù)來(lái)初始化某數(shù)組或結(jié)構(gòu)體變量,然后用memcpy函數(shù)將內(nèi)容復(fù)制到被初始化的變量中。例如,定義一數(shù)組變量szStringContent,要將“zhou”復(fù)制到szStringContent中去,則示例代碼如下:charszStringContent[1024]={0};……memset(szStringContent,0x00,sizeof(szStringContent));memcpy(szStringContent,"zhou",strlen("zhou"));……strcat和strncat在實(shí)際的軟件開發(fā)項(xiàng)目中,程序經(jīng)常會(huì)對(duì)字符串進(jìn)行操作。為此,C函數(shù)庫(kù)中提供了一些用來(lái)對(duì)字符串進(jìn)行處理的函數(shù),使用起來(lái)非常的方便。但由于字符串都有長(zhǎng)度,如果隨意對(duì)不同的字符串進(jìn)行連接和復(fù)制等操作,就可能出現(xiàn)意想不到的后果。因此,在實(shí)際開發(fā)中,十分強(qiáng)調(diào)對(duì)字符串處理函數(shù)進(jìn)行異常保護(hù)。本節(jié)介紹strcat和strncat的使用方法,5.3節(jié)和5.4節(jié)分別介紹strcpy和strncpy、strcmp和strncmp的使用方法。strcat函數(shù)的作用是連接兩個(gè)字符數(shù)組中的字符串。在MSDN中,其定義為:char*strcat(char*strDestination,constchar*strSource);Remarks:ThestrcatfunctionappendsstrSourcetostrDestinationandterminateststrcat函數(shù)將strSource字符串拼接到strDestination后面,最后的返回值是拼裝完成之后的字符串strDestination。這里有一個(gè)問(wèn)題,如果字符串strSource的長(zhǎng)度大于strDestination數(shù)組的長(zhǎng)度,就會(huì)出現(xiàn)數(shù)組越界的錯(cuò)誤,程序就會(huì)崩潰。如下代碼所示:/***************************************************************版權(quán)所有(C)2014,ZhouZhaoxiong。*文件名稱:StrcatTest.c內(nèi)容摘要:用于測(cè)試strcat函數(shù)其他說(shuō)明:無(wú)當(dāng)前版本:V1.0作 者:周兆熊*完成日期:20141121****************************************************************/#include<stdio.h>#include<string.h>typedefsignedcharINT8; //重定義數(shù)據(jù)類型typedefsignedintINT32; //重定義數(shù)據(jù)類型/**********************************************************************功能描述:主函數(shù)輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:0-執(zhí)行完成其他說(shuō)明:無(wú)修改日期 版本號(hào) 修改人 修改內(nèi)容* *20141121 V1.0 周兆熊 創(chuàng)建***********************************************************************/INT32main(void){INT8szStrDestination[10]="Hello";INT8szStrSource[10] ="Hello123";//先打印源字符串和目的字符串printf("Thesourcestringis:%s\n",szStrSource);printf("Thedestinationstringis:%s\n",szStrDestination);strcat(szStrDestination,szStrSource); //調(diào)用strcat函數(shù)//打印拼裝完成之后的字符串printf("Thechangeddestinationstringis:%s\n",szStrDestination);return0;}在該段代碼中,szStrDestination數(shù)組的長(zhǎng)度小于szStrSource中字符串的長(zhǎng)度,當(dāng)利用strcat函數(shù)進(jìn)行字符串的連接操作時(shí),異常就出現(xiàn)了。執(zhí)行代碼后彈出的異??蛉鐖D5.3所示。圖5.3 strcat測(cè)試程序異常提示框?yàn)榱私鉀Q這個(gè)問(wèn)題,在使用strcat函數(shù)之前,需要先對(duì)字符串和字符數(shù)組的長(zhǎng)度進(jìn)行比較,讓字符串函數(shù)進(jìn)行安全的連接操作,即保證最終字符串的長(zhǎng)度不超過(guò)目的字符數(shù)組的長(zhǎng)度。按照此思路編寫的代碼如下所示:/***************************************************************版權(quán)所有(C)2014,ZhouZhaoxiong。*文件名稱:StrcatTest.c內(nèi)容摘要:用于測(cè)試strcat函數(shù)其他說(shuō)明:無(wú)當(dāng)前版本:V1.0作 者:周兆熊*完成日期:20141121**************

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論