我试图自己实现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;
}
答案 0 :(得分:14)
代码没问题。
看起来你的主叫代码有问题。
你还记得为目标字符串分配足够的内存吗?
答案 1 :(得分:8)
我强烈建议使用指针而不是整数索引,以免出现整数溢出。即使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
开头的公共函数)保留用于实现。
答案 2 :(得分:3)
dest需要有足够的内存来容纳此实现中的串联。在此实现中,它必须由调用者分配。您还应确保dest和src都以null结尾。如果dest没有足够的内存,这将覆盖其他内容可能使用的内存。
答案 3 :(得分: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();
}
答案 4 :(得分:0)
为目标字符串分配足够的内存..即至少(源字符串的长度+ 1)。