1

Possible Duplicate:
Any better suggestions for this c functions copyString,concatString

I'm trying to write strcat using pointers, I can't change the main().

void str_cat(char **s1,char *s2) {
   while(**s1)
      *(s1++); /* go to the end of string1*/

   /* copy string 2 at the end of string 1*/
   while(*s2)
      *(s1++) = (s2++);
   puts(*s1);
 }

I call the function from the main as follow:

char *str = NULL;
str_cat(&str, " World!");

The problem is when I try to get to the end of s1, but it's not incrementing correctly.

Thanks!

4

4 に答える 4

2

s2あなたの関数は、を最後に追加できることを前提としていますs1。したがってs1、を収容するのに十分な大きさである必要がありますs2

NULLとして渡しs1、NULLポインターを逆参照していますが、これは未定義の動作です。

また、あなたの場合、文字ポインタのアドレスを渡す必要は実際にはありません。

于 2012-11-20T12:06:24.297 に答える
1
*(s1++); /* go to the end of string1*/

それは をインクリメントしchar**、逆参照操作はそこで何もしません。指す先をインクリメントしchar*たいので、必要になります

(*s1)++;

(同様ですs2。)

ただし、呼び出し元のポインターを実際に変更したくない可能性があるため、一時変数を使用する必要があります。

char *temp = *s1;

それをインクリメントして最初の文字列の終わりを見つけるか、char*最初に a を渡すことをお勧めします。

そしてもちろん、実際の 0 で終わる文字列へのポインターでのみ呼び出す必要があります。

于 2012-11-20T12:05:19.797 に答える
1

あなたのコードにはUndefined Behaviorがあります。
有効なメモリを指していないポインタに書き込んでいます。strが指す有効なメモリを指していませんNULL

コピーするコンテンツを保持するのに十分な大きさの有効なメモリを指すのは、ユーザーの責任strです。そうでない場合、結果が未定義の動作であり、標準に準拠していないプログラムであり、あらゆる動作が可能であることを意味します。

于 2012-11-20T12:05:20.763 に答える
1

これは私が持っているものです。

  char * strcat (char *dest, const char *src)
{
    char *dp;
    char *sp = (char *)src;

    if ((dest != NULL) && (src != NULL))
    {
        dp = &dest[strlen(dest)];

        while (*sp != '\0')
        {
            *dp++ = *sp++;
        }
        *dp = '\0';
    }
    return dest;
}
于 2012-11-20T12:21:21.200 に答える