1

私は基本的に、C で独自の文字列関数をコーディングしています。

私はポインターを使用して関数を実行しようとしましたが、ヒープを使用してメモリを割り当てるか、ヒープに残すstrcatかを理解できないようです。malloc

char *my_strcat(const char *s1, const char *s2)
{


    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    unsigned char *string;
        //string = malloc(strlen(s1) + strlen(s2) + 1);
    while (*p1 != '\0')
{
        *string = *p1;
        string++;
        p1++;

        if(*p1 == '\0')
        {
            while(*p2 != '\0')
            {
                *string = *p2;
                string++;
                p2++;
            }
        }
    }
    return (char *)string;  
}

このタスクをより効率的に実行するためのヒントや、私が間違っていることは素晴らしいことです!

乾杯

編集

さて、私は実用的な解決策を得ましたが、malloc を使用した後、どこで free() する必要があるのでしょうか?

char *my_strcat(const char *s1, const char *s2)
{


    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    char *string = malloc(sizeof(char *));
    char *res = string;

    while (*p1 != '\0')
{
        *string = *p1;
        string++;
        p1++;
    }
    while (*p2 != '\0')
    {
        *string = *p2;
        string++;
        p2++;
}
    *string = '\0'; 

    return (char *)res; 
}
4

3 に答える 3

3

まず、割り当てが間違ってコメントアウトされていると仮定します。

  • 割り当てたポインタを保存して返す必要があります。それ以外の場合は、連結結果の最後stringを指すポインタを返します
  • 結果の文字列を終了していません。追加する必要があります*string = '\0'
  • 2 番目のループを最初のループの外側に移動し、そのif周りの条件を削除する必要があります。最初のループが終了した場合、それ*p1\0

char *string = malloc(strlen(s1) + strlen(s2) + 1);
char *res = string;
for (; *p1 ; *string++ = *p1++);
for (; *p2 ; *string++ = *p2++);
*string = '\0';
return res;  
于 2012-08-29T03:53:14.653 に答える
2

strcat はメモリを割り当てないので、同じことを達成しようとしている場合は、malloc を使用する必要はありません。

char* strcat(char* destination,char* source) {
 int c = 0;
 int sc;

 while(destination[c] != 0) {  c++; }

 for(sc = 0;sc < strlen(source);sc++) {
  destination[sc+c] = source[sc];
 }

 destination[sc+c] = 0;

 return destination;

}
于 2012-08-29T03:51:20.893 に答える