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 }
