3

重複の可能性:
このc関数のより良い提案はcopyString、concatString

これは就職の面接からの質問です。特定の署名を使用して実装する必要があります。これは、作業に必要なコードです。

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_strcpy への私の実装です:

char* new_strcpy(char **dst,const char *source)
{

  char *ans=*dst;

  while(**dst++=*source++);

  return ans;

}

しかし、このソリューションはクラッシュします。誰かが私を助けてくれますか?

4

1 に答える 1

6

ソリューションの問題は、メモリの割り当てに失敗することです*dst

動作する必要があるコードの最初の 3 行を考えてみましょう。

char *str = NULL;
new_strcpy(&str , "string one");
new_strcpy(&str , str +7);         // ***

このことから、次のことが明らかです。

  1. new_strcpy()結果のためにメモリを割り当てる必要があります。
  2. str新たに割り当てるときは、メモリ リークを避けるためnew_strcpy()に以前の割り当てを解除する必要があります。str
  3. ***上記の行を機能させるには、割り当てのに割り当て解除を行う必要があります。

これは、アイデアを提供するためのスケルトン実装です。私は 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()実装は読者の演習として残します。:-)

于 2012-12-05T09:15:22.410 に答える