strcpy函數(shù)的用法.doc_第1頁
strcpy函數(shù)的用法.doc_第2頁
strcpy函數(shù)的用法.doc_第3頁
strcpy函數(shù)的用法.doc_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

C語言標(biāo)準(zhǔn)庫函數(shù)原型聲明:extern char *strcpy(char *dest,char *src); 頭文件:string.h 功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中。 說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。 返回指向dest的指針。 典型實現(xiàn)/* * C語言標(biāo)準(zhǔn)庫函數(shù)strcpy的一種典型的工業(yè)級的最簡實現(xiàn) * 返回值: * 返回目標(biāo)串的地址。 * 對于出現(xiàn)異常的情況ANSI-C99標(biāo)準(zhǔn)并未定義,故由實現(xiàn)者決定返回值,通常為NULL。 * 參數(shù): * strDeatination * 目標(biāo)串 * strSource * 源串 */ char *strcpy(char *strDestination, const char *strSource) assert(strDestination & strSource); char *strD=strDestination; while (*strDestination+=*strSource+)!=0); NULL; return strD; 編輯本段出現(xiàn)頻率最高的筆試題strcpy寫法題目:已知strcpy函數(shù)的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不調(diào)用庫函數(shù),實現(xiàn)strcpy函數(shù)。 2.解釋為什么要返回char *。 解說:1.strcpy的實現(xiàn)代碼 char * strcpy(char * strDest,const char * strSrc) if (strDest=NULL)|(strSrc=NULL) /1 throw Invalid argument(s); /2 char * strDestCopy=strDest; /3 while (*strDest+=*strSrc+)!=0); /4 return strDestCopy; 錯誤的做法: 1 (A)不檢查指針的有效性,說明答題者不注重代碼的健壯性。 (B)檢查指針的有效性時使用(!strDest)|(!strSrc)或(!(strDest&strSrc),說明答題者對C語言中類型的隱式轉(zhuǎn)換沒有深刻認(rèn)識。在本例中char *轉(zhuǎn)換為bool即是類型隱式轉(zhuǎn)換,這種功能雖然靈活,但更多的是導(dǎo)致出錯概率增大和維護成本升高。所以C+專門增加了bool、true、false三個關(guān)鍵字以提供更安全的條件表達式。 (C)檢查指針的有效性時使用(strDest=0)|(strSrc=0),說明答題者不知道使用常量的好處。直接使用字面常量(如本例中的0)會減少程序的可維護性。0雖然簡單,但程序中可能出現(xiàn)很多處對指針的檢查,萬一出現(xiàn)筆誤,編譯器不能發(fā)現(xiàn),生成的程序內(nèi)含邏輯錯誤,很難排除。而使用NULL代替0,如果出現(xiàn)拼寫錯誤,編譯器就會檢查出來。 2 (A)return new string(Invalid argument(s);,說明答題者根本不知道返回值的用途,并且他對內(nèi)存泄漏也沒有警惕心。從函數(shù)中返回函數(shù)體內(nèi)分配的內(nèi)存是十分危險的做法,他把釋放內(nèi)存的義務(wù)拋給不知情的調(diào)用者,絕大多數(shù)情況下,調(diào)用者不會釋放內(nèi)存,這導(dǎo)致內(nèi)存泄漏。 (B)return 0;,說明答題者沒有掌握異常機制。調(diào)用者有可能忘記檢查返回值,調(diào)用者還可能無法檢查返回值(見后面的鏈?zhǔn)奖磉_式)。妄想讓返回值肩負(fù)返回正確值和異常值的雙重功能,其結(jié)果往往是兩種功能都失效。應(yīng)該以拋出異常來代替返回值,這樣可以減輕調(diào)用者的負(fù)擔(dān)、使錯誤不會被忽略、增強程序的可維護性。 3 (A)忘記保存原始的strDest值,說明答題者邏輯思維不嚴(yán)密。 4 (A)循環(huán)寫成while (*strDest+=*strSrc+);,同1(B)。 (B)循環(huán)寫成while (*strSrc!=0) *strDest+=*strSrc+;,說明答題者對邊界條件的檢查不力。循環(huán)體結(jié)束后,strDest字符串的末尾沒有正確地加上0。 2.返回strDest的原始值使函數(shù)能夠支持鏈?zhǔn)奖磉_式,增加了函數(shù)的“附加值”。同樣功能的函數(shù),如果能合理地提高的可用性,自然就更加理想。 鏈?zhǔn)奖磉_式的形式如: int iLength=strlen(strcpy(strA,strB); 又如: char * strA=strcpy(new char10,strB); 返回strSrc的原始值是錯誤的。其一,源字符串肯定是已知的,返回它沒有意義。其二,不能支持形如第二例的表達式。其三,為了保護源字符串,形參用const限定strSrc所指的內(nèi)容,把const char *作為char *返回,類型不符,編譯報錯。 在上面的語句中,循環(huán)語句while (*strDest+=*strSrc+)!=0);較難理解,可以把這句理解為一下操作。 第一種: while(1) char temp; temp=*strDest=*strSrc; strDest+; strSrc+; if(0=temp) break; 第二種: while(*strSrc!=0) *strDest=*strSrc; strDest+; strSrc+; *strDest=*strSrc; 個人意見:throw用法明顯的運行不通,如果要判斷加#include 如果表達式的值為假,整個程序?qū)⑼顺?,并輸出一條錯誤信息。如果表達式的值為真則繼續(xù)執(zhí)行后面的語句。 使用這個宏前需要包含頭文件assert.h #include #include char * strcpy(char * strDest ,const char *strSrc) assert(strDest!=NULL) & (strSrc !=NULL); char * strDest

溫馨提示

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

評論

0/150

提交評論