深夜復習strcpy函數原型-----竟然暗藏着這么多玄機


strcpy

原型聲明:extern char *strcpy(char *dest,  char *src)

頭文件;string.h

功能:把src所指由NULL結束的字符串復制到dest所指的數組中。

說明:src和所指內存區域不可以重疊且必須有足夠的空間來容納src的字符串,返回指向dest的指針。

 

不使用庫函數實現strcpy函數(工業級)

 1 char *strcpy(char *strDest, const char *strSrc)
2 {
3   assert((strDest != NULL)&&(strSrc !=NULL));
4   char *tmp = strDest;
5   while ((*strDest++ = *strSrc++) !='\0')
6     {
7       ;//或是 NULL;
8     }
9   return tmp;
10 }
 


幾點說明:

1.注意編程風格,使用strDest, strSrc 這樣增強可讀性的名字。

2.使用斷言來檢驗輸入參數的有效性,如果沒有對傳入參數strDest和strSrc進行檢查,一但它們中有一個為NULL,立死!  assert宏的原型定義在<assert.h>中,其作用是如果它的條件返回false,則終止程序執行。可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。

3.使用const來約束strSrc,提高程序的健壯性。如果函數體內的語句試圖改動strSrc的內容,編譯器將指出錯誤。

4.strcpy能把strSrc的內容復制到strDest;為什么還需要char *類型的返回值?

這是為了實現鏈式表達。增加了函數的“附加值”。同樣功能的函數,如果能合理地提高的可用性,自然就更加理想

例如:

int length = strlen(strcpy(strDest, "hello, world!"));

另一種形式:(入門級)

 1 char *strcpy(char *strDest, const char *strSrc)
2 {
3   assert((strDest != NULL)&&(strSrc != NULL));
4   char *address = strDest;
5   while (*strSrc != '\0')
6   {
7     *strDest++ = *strSrc++;
8   }
9   *strDest = '\0';
10   return address;
11 }




 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM