7

strcat を自分で実装しようとしたところ、Wikiでこのような strcat の実装を見つけたのですが、使用するとセグメンテーション違反が発生します。

以下のコードの何が問題になっていますか?

char *
strcat(char *dest, const char *src)
{
    size_t i,j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}
4

5 に答える 5

15

コードは大丈夫です。

呼び出しコードに問題があるようです。

ターゲット文字列に十分なメモリを割り当てたことを覚えていますか?

于 2010-03-21T20:21:47.743 に答える
9

整数オーバーフローを恐れて、整数インデックスではなくポインターを使用することを強くお勧めします。size_tが と同じビット数であっても、ポインターを追加しない場所にインデックスを追加していますchar *

それは多かれ少なかれアカデミックだと思います。strcat()マルチギガバイトの文字列を呼び出している場合は、おそらくあらゆる種類の問題に直面しています。

完全を期すために、ポインターベースのバージョンを次に示します。

char *
my_strcat(char *dest, const char *src)
{
    char *rdest = dest;

    while (*dest)
      dest++;
    while (*dest++ = *src++)
      ;
    return rdest;
}

確かに、これは戻り値のために別のポインターに相当するスペースを必要としrdestますが、それは良いトレードオフだと思います。

strcat()また、通常のアプリケーション コードで呼び出される関数を合法的に定義することはできないことに注意してください。名前空間全体 (名前が で始まるパブリック関数str) は実装用に予約されています。

于 2010-03-22T07:52:54.637 に答える
3

destには、この実装での連結に対応するのに十分なメモリが必要です。この実装では、呼び出し元が割り当てる必要があります。また、destとsrcの両方がnullで終了していることを確認する必要があります。destに十分なメモリがない場合、他の何かが使用する可能性のあるメモリが上書きされます。

于 2010-03-21T20:25:34.553 に答える
0

それは私とうまくいっています、私はそれをチェックしました。

    #include "stdio.h"


    char *strcat(char *dest, const char *src)

    {

    size_t i,j;

    for (i = 0; dest[i] != '\0'; i++)

        ;

    for (j = 0; src[j] != '\0'; j++)

        dest[i+j] = src[j];

    dest[i+j] = '\0';

    return dest;

}


void main(void)

{

    char a[10]={"abc"}, b[10]={"def"};

    strcat(a,b);

    printf("%s",a);

    getchar();

}
于 2010-03-22T07:43:44.200 に答える