您的解决方案的问题是您无法为*dst
.
考虑需要工作的前三行代码:
char *str = NULL;
new_strcpy(&str , "string one");
new_strcpy(&str , str +7); // ***
由此可见:
new_strcpy()
需要为结果分配内存。
str
重新分配时,new_strcpy()
需要解除之前的分配str
以避免内存泄漏。
- 为了使
***
上面的行工作,释放必须在分配之后发生。
这是一个框架实现给你的想法。我根据strcpy()
et al 实现了这些函数,但是如果不允许调用库函数,您可以编写自己的循环(您已经知道如何做到这一点)。
#include <stdlib.h>
#include <string.h>
void new_strcpy(char** dst, const char* src) {
char* orig_dst = *dst;
*dst = malloc(strlen(src) + 1);
strcpy(*dst, src); /* replace with a loop if calling strcpy() is not permissible */
free(orig_dst);
}
void new_strcat(char** dst, const char* src) {
char* orig_dst = *dst;
*dst = malloc(strlen(*dst) + strlen(src) + 1);
strcpy(*dst, orig_dst); /* replace with a loop if calling strcpy() is not permissible */
strcat(*dst, src); /* ditto for strcat() */
free(orig_dst);
}
void new_free(char** dst) {
free(*dst);
*dst = NULL;
}
int main(int argc, char *argv[])
{
char *str = NULL;
new_strcpy(&str , "string one");
new_strcpy(&str , str +7);
new_strcat(&str , " two");
/* new_printf(&str , "%str !", s); */
puts(str );
new_free(&str);
return 0;
}
我将实施new_printf()
作为练习留给读者。:-)