strcat实现

8
我试图自己实现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;
}

3
代码看起来没问题。你确定你正确地使用它了吗?什么是“客户端代码”? - jpalecek
加入一个检查,以确保 destsrc 不为空。 - mpez0
在标准 C 中,当其中任一指针为空时,库可以任意行事;这种行为是未定义的。合法的未定义行为包括“正常工作”和“崩溃并生成核心转储”,以及“删除您有权限删除的机器上的每个文件”。不要冒险,不要使用空指针调用库函数。 - Jonathan Leffler
问题应该是:“为什么Wikipedia的strcat实现是错误的?”您应该在维基讨论页面(http://en.wikipedia.org/wiki/Talk:Strcat)上提出这个问题。此外,很可能是您的客户端代码(甚至可能不存在)出了问题。 - Martin Wickman
非常正确,但是重新实现库函数时,特别是在报告分段违规时,检查空值并遵循最小惊讶原则似乎是合适的做法。 - mpez0
这是一个糟糕的想法。大多数无效指针并不是空指针,所以在实践中这并没有什么帮助。而当你确实检测到一个空指针时,你打算怎么处理它?终止程序吗?因为无论如何都会发生这种情况。 - melpomene
5个回答

16

代码没问题。

看起来你在调用代码中遇到了问题。

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


1
特别是对于空终止符。 - SLaks
7
+1,很可能原帖作者正在使用字符串常量作为目标参数进行调用。 - Carl Norum

10

我强烈建议使用指针而不是整数索引,以免出现整数溢出的情况。即使 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没有足够的内存,则会覆盖可能被其他内容使用的内存。


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

}

0

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


2
嗯...没有什么新的答案,对吧? - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接