【问题标题】:strcat implementationstrcat 实现
【发布时间】:2011-01-30 02:54:39
【问题描述】:

我自己尝试实现strcat,从Wiki找到strcat实现是这样的……但是我用的时候,出现segmentation fault。

下面的代码有什么问题?

char *
strcat(char *dest, const char *src)
{
    size_t i,j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}

【问题讨论】:

  • 代码看起来不错。你确定你使用正确吗?什么是“客户端代码”?
  • 检查destsrc 是否为空。
  • 在标准 C 中,当任一指针为空时,库可以做它喜欢做的事情;行为未定义。合法的未定义行为确实包括“正常工作”;它还包括“使用核心转储崩溃”和“删除机器上您有权删除的每个文件”。不要冒险——不要使用空指针调用库函数。
  • 问题应该是:“为什么维基百科的 strcat 实现错误?”。您应该在 wiki 讨论页面 (en.wikipedia.org/wiki/Talk:Strcat) 上询问。此外,可能是您的客户端代码(甚至可能不存在)损坏了。
  • 非常正确,但是在重新实现库函数时,特别是在报告分段违规时,检查空值并遵循最小意外原则似乎是合适的做法。

标签: c strcat


【解决方案1】:

代码没问题。

看来你的调用代码有问题。

你还记得为目标字符串分配足够的内存吗?

【讨论】:

  • 尤其是空终止符。
  • +1,可能是 OP 使用字符串常量作为目标参数调用。
【解决方案2】:

我强烈建议使用指针而不是整数索引,因为担心整数溢出。即使size_tchar * 的位数相同,您也添加索引,而您不会添加指针。

我想这或多或少是学术性的;如果您在数千兆字节的字符串上调用 strcat(),您可能会遇到各种麻烦。

为了完整起见,这是一个基于指针的版本:

char *
my_strcat(char *dest, const char *src)
{
    char *rdest = dest;

    while (*dest)
      dest++;
    while (*dest++ = *src++)
      ;
    return rdest;
}

当然,这确实为 rdest 返回值占用了另一个指针的空间,但我认为这是一个很好的权衡。

另外请注意,您不能在普通应用程序代码中合法地定义名为strcat() 的函数;整个命名空间(名称以str 开头的公共函数)为实现保留。

【讨论】:

    【解决方案3】:

    dest 需要有足够的内存来容纳此实现中的串联。在这个实现中,它必须由调用者分配。您还应该确保 dest 和 src 都以 null 结尾。如果 dest 没有足够的内存,这将覆盖可以被其他东西使用的内存。

    【讨论】:

      【解决方案4】:

      它对我来说很好用,我已经检查过了。

          #include "stdio.h"
      
      
          char *strcat(char *dest, const char *src)
      
          {
      
          size_t i,j;
      
          for (i = 0; dest[i] != '\0'; i++)
      
              ;
      
          for (j = 0; src[j] != '\0'; j++)
      
              dest[i+j] = src[j];
      
          dest[i+j] = '\0';
      
          return dest;
      
      }
      
      
      void main(void)
      
      {
      
          char a[10]={"abc"}, b[10]={"def"};
      
          strcat(a,b);
      
          printf("%s",a);
      
          getchar();
      
      }
      

      【讨论】:

        【解决方案5】:

        为目标字符串分配足够的内存.. 即至少(源字符串的长度 + 1)。

        【讨论】:

        • hmm .. 之前的答案没什么新意,是吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        相关资源
        最近更新 更多