1

这是我已经实现的 strcat 函数,但是当我转到 line 时出现分段错误*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;
    }
4

7 回答 7

2

The idiomatic way is

while (*dst++ = *src++);
于 2012-11-20T08:41:46.713 回答
2

Some observations:

  1. You're not copying the termination, leaving a non-terminated string in dst. This is the cause of the actual problems.
  2. This: if(dst == '\0'||src == '\0') is weird, if the intent was comparing against NULL you should do so more directly and not use character literals.
  3. The src argument should be const char * since it's read-only. Using const for pointers that are "input" arguments is a very good idea, since it communicates intent right there in the prototype. It also helps avoid mistakingly writing to the wrong string.
  4. You can't have a function beginning with str, that "namespace" is reserved for the standard library.
于 2012-11-20T08:42:08.097 回答
1

这里有多个问题:

问题 - 我

malloc 分配的内存

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

丢失,因为稍后您正在执行以下操作:

    fdst = dst;

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

问题-二

解决上述问题后,您必须解决此问题:

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

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

问题 - III

最后,你到底这样做了..!!

return fdst;

你意识到那里的错误吧?希望你能照顾好[提示:保存起始地址并在最后返回它,而不是递增的指针;)]

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

于 2012-11-21T06:01:41.850 回答
1

可能的崩溃原因:

1)可能是你的长度dst不足以支持src和的连接dst

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

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

另一句话你必须在第二个之后完成你的dst字符串'\0'while

 while (*src != '\0')
        *dst++ = *src++;
 *dst='\0';
于 2012-11-20T08:57:09.780 回答
1

尝试这个:

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

这可能会有所帮助。

于 2012-11-20T09:06:31.843 回答
1

您的代码中有很多错误:

  1. if (dst == '\0' || src == '\0')通过检查您正在尝试什么。首先,这不是明确的条件 - 您应该使用if (dst == NULL || src == NULL)orif (*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. 您没有终止结果字符串。

您的问题的答案:分段错误可能是因为您的 dst 不够长,无法同时保存 src 和 dst。您可以使用第 2 点中的提示来修改您的代码,或者您可以在函数外部声明更大的缓冲区,其大小至少为(strlen(dst) + strlen(src) + 1. 另一个原因可能是使用常量字符串调用此函数,例如 char *str = "string";。在这种情况下,字符串很可能是常量,您不能修改它(在大多数操作系统中,它位于程序的不可修改部分,您只有指向该位置的指针)。

于 2012-11-20T09:11:02.903 回答
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;
于 2012-11-20T10:16:10.770 回答