这是我实现的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;
}
答案 0 :(得分:2)
习惯的方式是
while (*dst++ = *src++);
答案 1 :(得分:2)
一些观察结果:
dst
中留下一个未终止的字符串。这是实际问题的原因。if(dst == '\0'||src == '\0')
很奇怪,如果意图与NULL
进行比较,你应该更直接地这样做,而不是使用字符文字。src
参数应为const char *
,因为它是只读的。使用const
作为“输入”参数的指针是一个非常好的主意,因为它在原型中传递意图。它还有助于避免错误地写错字符串。str
开头的功能,“名称空间”是为标准库保留的。答案 2 :(得分:1)
可能的崩溃原因:
1)可能是dst
的长度不足以支持src
和dst
的连续。
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)
您的代码中存在很多错误:
if (dst == '\0' || src == '\0')
您正在尝试检查此内容。首先,这不是明确的条件 - 您应该使用if (dst == NULL || src == NULL)
或if (*dst == '\0' || *src == '\0')
更准确,并使其更加清晰。第二,即使这种情况是正确的(if (*dst == '\0' || *src == '\0')
),你也无法实现连接。至少如果*src == '\0'
你应该返回原始字符串 - dst。malloc (strlen(dst) + strlen(src) + 1
) - 注意额外+1
以便保留终止'/ 0'字符)你的问题的答案:分段错误可能是因为你的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;