我不明白为什么我的字符没有被复制,strlen是正确的但是输出的'\ n'
char *my_strdup(char *str)
{
char *new_str;
char *to_copy;
int i;
to_copy = str;
i = strlen(str + 1);
new_str = malloc(sizeof(*new_str) * i + 1);
while(i - 1 > 0)
{
*new_str = *to_copy;
new_str++;
to_copy++;
i--;
}
return(new_str);
}
这是我的测试功能:
int main()
{
char *str;
str = my_strdup("helloo");
printf("%s\n", str);
}
答案 0 :(得分:6)
您正在返回指向字符串末尾的指针,而不是字符串的开头。
你需要返回malloc
给你的指针。这就是您在new_str
的初始分配中放入new_str
的内容。但是不是返回它,而是修改指针然后返回它。
您的代码还有很多其他问题。例如,此时:
i = strlen(str + 1);
您计算从str[1]
开始的字符串的长度。如果您的字符串长度为零,那将导致未定义的行为。
也许你打算写:
i = strlen(str) + 1;
在这种情况下,您对malloc
的调用将分配过多。
使用sizeof(*new_str)
毫无意义,因为保证等于1
。
无论如何,这里有一些可能的替代方案,而不是试图修复你的代码。
char *mystrdup(const char *str)
{
char *result = malloc(strlen(str) + 1);
char *psrc = str;
char *pdst = result;
while (*psrc != 0)
{
*pdst = *psrc;
pdst++;
psrc++;
}
*pdst = '\0';
return result;
}
你可以像这样使循环体更简洁:
*pdst++ = *psrc++;
您可以使用for循环执行此操作:
char *mystrdup(const char *str)
{
size_t len = strlen(str);
char *result = malloc(len + 1);
for (size_t i = 0; i <= len; i++)
result[i] = str[i];
return result;
}
或者你甚至可以像这样使用memcpy
:
char *mystrdup(const char *str)
{
size_t len = strlen(str);
char *result = malloc(len + 1);
memcpy(result, str, len + 1);
return result;
}
请注意,在所有情况下,我从malloc
返回的值都是未修改的。
我忽略了对malloc调用的可能错误条件。你可以担心!