字符串连接的实现

时间:2012-11-20 08:39:26

标签: c

这是我实现的strcat函数,但是当我转到*dst++ = *src++;行时,我遇到了分段错误。我已将src增加到'\0',因为我想从那里追加下一个字符串。你能告诉我它为什么会出现分段错误吗?我是否通过*dst++ = *src++;做出任何逻辑错误?

char *strconcat(char *dst, char *src)
{
    char *fdst;
    fdst = dst;
    if (dst == '\0' || src == '\0')
    return fdst;

    while (*dst != '\0')
        dst++;
    while (*src != '\0')
        *dst++ = *src++;

    return fdst;
}

嘿,我经历了下面给出的许多解决方案,我做了以下更改,但是当我开始连接两个字符串时,我仍然遇到分段问题,这是我的整个代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *strconcat(char *dst, const char *src);
void main()
{
    char *str1 = "Stack";
    char *str2 = "overflow";
    printf("MY CONCAT:%s\n",strconcat(str1, str2));
    printf("INBUILT CONCAT:%s\n",strcat(str1, str2));
}

char *strconcat(char *dst, const char *src)
{
    char *fdst;
    int dst_len = 0, src_len = 0;

    dst_len = strlen(dst);
    src_len = strlen(src);
    fdst = (char *) malloc(dst_len + src_len + 1);

    fdst = dst;
    if (src == NULL)
        return fdst;

    while(*dst)
    {
       dst++;
       fdst++;
    }
    while(*src)
       *fdst++ = *src++;
       *fdst = '\0';

    return fdst;
    }

7 个答案:

答案 0 :(得分:2)

习惯的方式是

while (*dst++ = *src++);

答案 1 :(得分:2)

一些观察结果:

  1. 您没有复制终止,在dst中留下一个未终止的字符串。这是实际问题的原因。
  2. 这个:if(dst == '\0'||src == '\0')很奇怪,如果意图与NULL进行比较,你应该更直接地这样做,而不是使用字符文字。
  3. src参数应为const char *,因为它是只读的。使用const作为“输入”参数的指针是一个非常好的主意,因为它在原型中传递意图。它还有助于避免错误地写错字符串。
  4. 您不能拥有以str开头的功能,“名称空间”是为标准库保留的。

答案 2 :(得分:1)

可能的崩溃原因:

1)可能是dst的长度不足以支持srcdst的连续。

2)你可能用输入字符指针调用了你的函数,它们没有指向已分配的内存(staic或dynamic)

3)可能是你的输入dst char指针指向一个常量字符串。

另一个评论,您必须在第二个dst之后使用'\0'完成while字符串

 while (*src != '\0')
        *dst++ = *src++;
 *dst='\0';

答案 3 :(得分:1)

试试这个:

while(*original)
  original++;
while(*add)
{
  *original = *add;
  add++;
  original++;
}
*original = '\0';

这可能会有所帮助。

答案 4 :(得分:1)

您的代码中存在很多错误:

  1. if (dst == '\0' || src == '\0')您正在尝试检查此内容。首先,这不是明确的条件 - 您应该使用if (dst == NULL || src == NULL)if (*dst == '\0' || *src == '\0')更准确,并使其更加清晰。第二,即使这种情况是正确的(if (*dst == '\0' || *src == '\0')),你也无法实现连接。至少如果*src == '\0'你应该返回原始字符串 - dst。
  2. 您应该检查dst是否足够长以存储新字符串,或者您应该在函数内部分配新缓冲区,以便同时包含dst和src(malloc (strlen(dst) + strlen(src) + 1) - 注意额外+1以便保留终止'/ 0'字符)
  3. 您没有终止结果字符串。
  4. 你的问题的答案:分段错误可能是因为你的dst不够长,无法容纳src和dst。您可以在第2点使用提示来修改代码,也可以在函数外部声明大小至少(strlen(dst) + strlen(src) + 1的缓冲区。 另一个原因可能是使用常量字符串调用此函数,例如char *str = "string";。在这种情况下,最可能的字符串是常量,并且不允许您修改它(在大多数操作系统中,它将位于程序的不可修改部分,并且您将只有指向此位置的指针)。

答案 5 :(得分:1)

这里有多个问题:

问题 - 我

使用malloc分配的内存

    fdst = (char *) malloc(dst_len + src_len + 1);

会丢失,因为稍后你会这样做:

    fdst = dst;

将'fdst'中malloc返回的地址替换为目标字符串的地址.. !!希望你自己解决它,它很简单。

问题 - II

解决上述问题后,你必须解决这个问题:

while(*dst)
{
   dst++;
   fdst++;
}

不仅要增加,您还必须将字符从dst复制到fdst,因为这将是您的连接字符串。

问题 - III

最后,你最终这样做了!! !!

return fdst;
你知道那里的错误吗?希望你能照顾一下[提示:保存起始地址并最后将其返回,而不是增加指针;)

注意:不是优化的解决方案,而是修复您的代码。

答案 6 :(得分:0)

您的代码是正确的,请参阅下面的说明!

我认为您在调用者中使用char *作为src和dst字符串。

使用数组声明会有所帮助,因为你的程序崩溃了

*dst++ = *src++;

因为dst和src指向常量且无法修改的字符串。

在下面的代码中我刚刚添加了main,你的函数没有改变!

#include<stdio.h>

char *strconcat(char *dst, char *src)
{
    char *fdst;
    fdst = dst;
    if (dst == '\0' || src == '\0')
        return fdst;

    while (*dst != '\0')
        dst++;
    while (*src != '\0')
        *dst++ = *src++;

    return fdst;
}

void main()
{
 char dest[10] = "one" ;
 char src[10] = "two" ;

printf("\n%s " , strconcat( dest , src ) ) ;
}

虽然您需要将if语句更改为

 if (*dst == '\0' || *src == '\0')
            return fdst;