7

我试图自己实现strcat,我从Wiki中找到了这样的strcat实现......但是当我使用它时,出现分段错误。

下面的代码有什么问题?

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;
}
4

5 回答 5

15

代码没问题。

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

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

于 2010-03-21T20:21:47.743 回答
9

我强烈建议使用指针而不是整数索引,以免整数溢出。即使size_t与 的位数相同char *,您也会在不会添加指针的地方添加索引。

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

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

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

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

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

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

于 2010-03-22T07:52:54.637 回答
3

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

于 2010-03-21T20:25:34.553 回答
0

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

    #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();

}
于 2010-03-22T07:43:44.200 回答
0

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

于 2013-09-10T07:02:30.177 回答