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 }
原文地址:https://www.cnblogs.com/guoyuqiangf8/p/2322542.html