ソリューションの問題は、メモリの割り当てに失敗することです*dst
。
動作する必要があるコードの最初の 3 行を考えてみましょう。
char *str = NULL;
new_strcpy(&str , "string one");
new_strcpy(&str , str +7); // ***
このことから、次のことが明らかです。
new_strcpy()
結果のためにメモリを割り当てる必要があります。
str
新たに割り当てるときは、メモリ リークを避けるためnew_strcpy()
に以前の割り当てを解除する必要があります。str
***
上記の行を機能させるには、割り当ての後に割り当て解除を行う必要があります。
これは、アイデアを提供するためのスケルトン実装です。私は et al の観点から関数を実装していますstrcpy()
が、ライブラリ関数の呼び出しが許可されていない場合は、独自のループを記述できます (その方法は既に知っています)。
#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()
実装は読者の演習として残します。:-)