strcat函數使用中出現的問題


strcat函數:

原型:extern char *strcat(char *strDest, char *strSrc);

功能:把strSrc所指字符串添加到strDest結尾處(覆蓋strDest結尾處的'\0')並添加'\0';

說明:strSrc和strDest所指內存區域不可以重疊且strDest必須有足夠的空間來容納strSrc的字符串。

返回指向strDest的指針。

 

 1 char *strcat(char *strDest, const char *strSrc)
2 {
3   char *address = strDest;
4   assert((strDest != NULL)&&(strSrc != NULL)); 對源地址和目的地址合法斷言。
5   while (*strDest != '\0')  //如果使用while (*strDest++),當strDest為空時,但此時strDest指向 空地址 的下一個地址。
6   {
7     strDest++;
8   }
9   while ((*strDest++ = *strSrc++) != '\0')
10   {
11     ;
12   }
13   return address;
14 }

 大多數C語言里面的字符串都是 一個是字符數組參數,一個是字符指針參數。否則會發生錯誤

例如:

1 int main(void)
2 {
3   char *str1 = "I love ";
4   char *str2 = "China";
5   strcat(str1,str2);
6   printf("%s\n", str1);
7   return 0;
8 }

vc編譯通過但運行失敗。原因如下:

1 while ((*strDest++ = *strSrc++) != '\0')
2 {
3   ;
4 }


如果此時strDest是一個指針,這時*strDest就是取一個未知地址的值,系統是不允許的。當strDest是一個數組時就正確了,因為數組分配的是連續的地址。安全地址當然可以使用了。

真正的以指針為參數的字符串拼接函數

 1 char *strcat(char *strDest, char *strSrc)
2 {
3   assert((strDest != NULL) && (strSrc != NULL));
4   char *address = (char *)malloc((strlen(strDest) + strlen(strSrc) + 1)*sizeof(char));
5   char *tmp = address;
6   assert(address != NULL);
7   while (*strDest != '\0')
8   {
9     *address = *strDest;
10     strDest++;
11     address++;
12   }
13   while (*strSrc != '\0')
14   {
15     *address = *strSrc;
16     strSrc++;
17     address++;
18   }
19   *address = '\0';
20   return tmp;
21 }

 


免責聲明!

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



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