zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    结对编程(阶段二)
    结对编程 第一阶段
    Git实验
    webpack02
    webpack01
    实验五 单元测试
    实验四 代码审评
    UML建模工具的安装和使用
    实验二 结对编程(阶段二)
    博客园背景的修改
  • 原文地址:https://www.cnblogs.com/guoyuqiangf8/p/2322542.html
Copyright © 2011-2022 走看看