5

だから、私はstrcpyCでこの実装を見てきました:

void strcpy1(char dest[], const char source[])
{
    int i = 0;
    while (1)
    {
        dest[i] = source[i];

        if (dest[i] == '\0')
        {
            break;
        }

        i++;
    } 
}

私にとっては、\0ソースから宛先にコピーすることさえあります。

そして、私はこのバージョンも見ました:

// Move the assignment into the test
void strcpy2(char dest[], const char source[]) 
{
    int i = 0;
    while ((dest[i] = source[i]) != '\0')
    {
        i++;
    } 
}

\0からsourceにを代入しようとすると壊れdestます。

コピーするかどうか、正しいオプションは何\0ですか?

4

9 に答える 9

7

コードは次のようになります。

char * strcpy(char *strDest, const char *strSrc)
{
    assert(strDest!=NULL && strSrc!=NULL);
    char *temp = strDest;
    while(*strDest++ = *strSrc++); // or while((*strDest++=*strSrc++) != '\0');
    return temp;
}

2 行目を削除して直接戻ることはできません。これにより、返されたコンテンツでエラーが発生します。たとえば、正しい値 (22 である必要があります) は返されず、返される長さをチェックします。char *temp = strDest;strDestchar *

char src_str[] = "C programming language";
char dst_str[100];
printf("dst_str: %d\n", strlen(strcpy(dst_str, src_str)));
于 2013-11-25T11:03:17.497 に答える
4

どちらもターミネータをコピーするため、どちらも正しいです。

strcpy2()最初に割り当て(コピー)を行い、次に比較を行うことに注意してください。そのため、ターミネータがコピーされたことに気付く前にコピーされ、停止します。

また、名前が で始まる関数strは予約済みであるため、どちらも「ユーザーレベル」コードとして実際には有効ではないことに注意してください。

于 2013-01-23T09:49:58.373 に答える
2

あなたが間違っている。\0どちらも(NUL ターミネータ) 文字をコピーします。常に NUL ターミネータ文字をコピーする必要があります。そうしないと、文字列が壊れます。いつ/どこで終了するかわかりません。

于 2013-01-23T09:49:22.147 に答える
1

どちらもターミネータをコピーするため、どちらも正しいです。

strcpy2() は最初にコピーを行い、次に比較を行います。したがって、ターミネータをコピーして停止します。

名前が str で始まる関数は予約されているため、他の変数または命名タイプを使用してください

于 2017-10-05T06:48:51.543 に答える
0

両方strcpy1()strcpy2()同じことをします。どちらも、NUL文字を宛先配列の最後にコピーします。

于 2013-01-23T09:59:11.387 に答える
0
char * strcpy(char *strDest, const char *strSrc)
{
    assert(strDest!=NULL && strSrc!=NULL);
    assert(strSrc + strlen(strSrc) < d || strSrc > strDest);  // see note

    char *temp = strDest;
    while(*strDest++ = *strSrc++)
        ;
    return temp;
}

// 4 行目のチェックを行わないと、null デリミネータを含む古い文字列が新しい文字列で上書きされ、コピーが停止できなくなります。

于 2016-05-11T02:35:36.003 に答える
-3

どちらも'\0'をコピーします。元の strcpy を完全にエミュレートしたい場合は、これを行う必要があります。

于 2013-01-23T09:49:32.267 に答える