strcpy典型實現

2021-05-28 04:45:05 字數 2729 閱讀 1353

c語言標準庫函式

原型宣告:extern char *strcpy(char *dest,char *src);

標頭檔案:string.h

功能:把src所指由null結束的字串複製到dest所指的陣列中。

說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。

返回指向dest的指標。

典型實現

/**********************

* c語言標準庫函式strcpy的一種典型的工業級的最簡實現

* 返回值:

* 返回目標串的位址。

* 對於出現異常的情況ansi-c99標準並未定義,故由實現者決定返回值,通常為null。

* 引數:

* strdestination

* 目標串

* strsource

* 源串

***********************/

char *strcpy(char *strdestination, constchar *strsource)

出現頻率最高的筆試題strcpy寫法

題目:

已知strcpy函式的原型是:

char * strcpy(char * strdest,const char *strsrc);

1.不呼叫庫函式,實現strcpy函式。

2.解釋為什麼要返回char *。

解說:

1.strcpy的實現**

char * strcpy(char * strdest,const char *strsrc)

錯誤的做法:

[1]

(a)不檢查指標的有效性,說明答題者不注重**的健壯性。

(b)檢查指標的有效性時使用((!strdest)||(!strsrc))或(!(strdest&&strsrc)),說明答題者對c語言中型別的隱式轉換沒有深刻認識。在本例中char *轉換為bool即是型別隱式轉換,這種功能雖然靈活,但更多的是導致出錯概率增大和維護成本公升高。所以c++專門增加了bool、true、false三個關鍵字以提供更安全的條件表示式。

(c)檢查指標的有效性時使用((strdest==0)||(strsrc==0)),說明答題者不知道使用常量的好處。直接使用字面常量(如本例中的0)會減少程式的可維護性。0雖然簡單,但程式中可能出現很多處對指標的檢查,萬一出現筆誤,編譯器不能發現,生成的程式內含邏輯錯誤,很難排除。而使用null代替0,如果出現拼寫錯誤,編譯器就會檢查出來。

[2]

(a)return new string("invalidargument(s)");,說明答題者根本不知道返回值的用途,並且他對記憶體洩漏也沒有警惕心。從函式中返回函式體內分配的記憶體是十分危險的做法,他把釋放記憶體的義務拋給不知情的呼叫者,絕大多數情況下,呼叫者不會釋放記憶體,這導致記憶體洩漏。

(b)return 0;,說明答題者沒有掌握異常機制。呼叫者有可能忘記檢查返回值,呼叫者還可能無法檢查返回值(見後面的鏈式表示式)。妄想讓返回值肩負返回正確值和異常值的雙重功能,其結果往往是兩種功能都失效。應該以丟擲異常來代替返回值,這樣可以減輕呼叫者的負擔、使錯誤不會被忽略、增強程式的可維護性。

[3]

(a)忘記儲存原始的strdest值,說明答題者邏輯思維不嚴密。

[4]

(a)迴圈寫成while(*strdest++=*strsrc++);,同[1](b)。

(b)迴圈寫成while (*strsrc!='\0')*strdest++=*strsrc++;,說明答題者對邊界條件的檢查不力。迴圈體結束後,strdest字串的末尾沒有正確地加上'\0'。

2.返回strdest的原始值使函式能夠支援鏈式表示式,增加了函式的「附加值」。同樣功能的函式,如果能合理地提高的可用性,自然就更加理想。

鏈式表示式的形式如:

int ilength=strlen(strcpy(stra,strb));

又如:

char * stra=strcpy(new char[10],strb);

返回strsrc的原始值是錯誤的。其一,源字串肯定是已知的,返回它沒有意義。其二,不能支援形如第二例的表示式。其三,為了保護源字串,形參用const限定strsrc所指的內容,把const char *作為char *返回,型別不符,編譯報錯。

在上面的語句中,迴圈語句while ((*strdest++=*strsrc++)!='\0');較難理解,可以把這句理解為以下操作。

第一種:

while(1)

第二種:

while(*strsrc!='\0')

*strdest=*strsrc;

個人意見:throw用法明顯的執行不通,如果要判斷加#include

如果表示式的值為假,整個程式將退出,並輸出一條錯誤資訊。如果表示式的值為真則繼續執行後面的語句。

使用這個巨集前需要包含標頭檔案assert.h

#include

#include

char * strcpy(char * strdest ,const char*strsrc)

void main()

{ char a[20], c="i am teacher!";

strcpy(a,c);

cout<

strcpy經典實現

char strcpy char strdest,const char strsrc 1.不呼叫庫函式,實現strcpy函式。2.解釋為什麼要返回char 解說 1.strcpy的實現 char strcpy char strdest,const char strsrc 錯誤的做法 1 a 不檢查指...

strcpy函式實現

已知strcpy函式的原型是 char strcpy char strdest,const char strsrc 不呼叫 庫函式,實現strcpy函式。解釋為什麼要返回char 解說 strcpy的實現 char strcpy char strdest,const char strsrc 錯誤的做...

strcpy 實現原理

已知strcpy函式的原型是 char strcpy char dst,const char src 實現strcpy函式 解釋為什麼要返回char 假如考慮dst和src記憶體重疊的情況,strcpy該怎麼實現 char strcpy char dst,const char src 1 1 con...