我在尝试实现自定义strcpy函数时遇到麻烦,该函数应该处理src字符串大于目标字符串的情况。在这里,我提供了一些代码,以便您可以看到整个功能。我的问题是,尽管我分配了足够的内存来容纳所有src,但每次增加* dest时,它都会进入一个空地址。这会导致(双指针)dest = * src中的分段错误。 dest以char **的形式存储,因为实际上,必须传递的参数是另一个字符串,该字符串的大小可能比src小,并且我希望尽可能安全地覆盖* dest。
int customStrCpy(char** dest, char* src){
int strlen1 = strlen(*dest), strlen2 = strlen(src);
if(strlen1 < strlen2){
//Creates a dynamically allocated array that is big enough to store the contents of line2.
*dest = calloc(strlen2, sizeof(char));
char* backup_str = *dest;
int copy_arrs;
for(copy_arrs = 0; copy_arrs < strlen2; copy_arrs++){
**dest = *src;
*dest++; src++;
}
*dest = backup_str;
}
else strcpy(*dest, src);
}
最后,(char **)dest应该指向正确的字符串。
答案 0 :(得分:0)
您需要在字符串长度上添加1
,以允许使用空终止符,并且如果要分配新字符串,则应释放dest
的旧内容。完成此操作后,您可以执行与strcpy()
相同的操作,无需重新分配。
也不需要int
返回类型(除非您要向malloc()
添加错误检查并返回状态结果)。此函数修改了一个参数,应为void
。
void customStrCpy(char** dest, char* src){
int strlen1 = strlen(*dest), strlen2 = strlen(src);
if(strlen1 < strlen2){
free(*dest); // Free the old string
//Creates a dynamically allocated array that is big enough to store the contents of line2.
*dest = malloc(strlen2+1);
}
strcpy(*dest, src); // or memcpy(*dest, src, strlen2+1);
}
答案 1 :(得分:0)
通常,strcpy
返回char *
,以便在其他操作中“直接”使用。
char *mysStrCpy(char **dest, const char *src)
{
size_t len = strlen(src);
char *tmpptr;
*dest = malloc(len + 1);
// or *dest = realloc(*dest, len + 1);
if(*dest)
{
tmpptr = *dest;
while(*tmpptr++ = *src++);
}
return *dest;
}
答案 2 :(得分:-1)
*dest++;
增加dest,而不是指针dest指向。您想要:
(*dest)++;
ps:有更好的方法来完成您追求的工作。...