88

memcpy()との違いは何strcpy()ですか?私はプログラムの助けを借りてそれを見つけようとしましたが、両方とも同じ出力を与えています。

int main()
{
    char s[5]={'s','a','\0','c','h'};
    char p[5];
    char t[5];
    strcpy(p,s);
    memcpy(t,s,5);
    printf("sachin p is [%s], t is [%s]",p,t);
    return 0;
}

出力

sachin p is [sa], t is [sa]
4

9 に答える 9

133

この効果を見るために何ができるか

このコードをコンパイルして実行します。

void dump5(char *str);

int main()
{
    char s[5]={'s','a','\0','c','h'};

    char membuff[5]; 
    char strbuff[5];
    memset(membuff, 0, 5); // init both buffers to nulls
    memset(strbuff, 0, 5);

    strcpy(strbuff,s);
    memcpy(membuff,s,5);

    dump5(membuff); // show what happened
    dump5(strbuff);

    return 0;
}

void dump5(char *str)
{
    char *p = str;
    for (int n = 0; n < 5; ++n)
    {
        printf("%2.2x ", *p);
        ++p;
    }

    printf("\t");

    p = str;
    for (int n = 0; n < 5; ++n)
    {
        printf("%c", *p ? *p : ' ');
        ++p;
    }

    printf("\n", str);
}

次の出力が生成されます。

73 61 00 63 68  sa ch
73 61 00 00 00  sa

memcpy()「ch」はによってコピーされたが、ではないことがわかりますstrcpy()

于 2010-05-24T22:14:35.997 に答える
99

strcpyNUL('\0')文字に遭遇すると停止しますが、停止memcpyしません。%sprintfもNULで停止するため、ここでは効果はわかりません。

于 2010-05-24T16:11:27.847 に答える
13

strcpyソース文字列のヌルターミネータが見つかると終了します。memcpyサイズパラメータを渡す必要があります。提示した場合printf、両方の文字配列でnullターミネータが検出された後、ステートメントは停止しますが、それらの配列にもデータが検出され、コピーされていますt[3]t[4]

于 2010-05-24T16:12:43.337 に答える
9

strcpyソースでNULLまたは「\0」文字が見つかるまで、ソースからデスティネーションに文字を1つずつコピーします。

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

ここで、asmemcpyは、ソース内のデータに関係なく、指定されたサイズnのソースから宛先にデータ(文字ではない)をコピーします。

memcpyソースに文字以外が含まれていることがよくわかっている場合に使用する必要があります。暗号化されたデータまたはバイナリデータの場合、memcpyは理想的な方法です。

strcpyは非推奨であるため、を使用してstrncpyください。

于 2012-12-05T12:36:32.383 に答える
4

主な違いは、memcpy()指定した正確なバイト数を常にコピーすることです。strcpy()一方、は、NUL(別名0)バイトを読み取るまでコピーし、その後停止します。

于 2010-05-24T16:11:51.223 に答える
3

s文字列にヌル文字が含まれているため、はprintfそれ以上の文字は表示されません。との違いはpt文字4と5にあります。p何もありません(ゴミになります) 。またt、とが'c'あり'h'ます。

于 2010-05-24T16:12:03.797 に答える
3
  • 動作の違い:またはstrcpyに遭遇すると停止しますNULL'\0'
  • パフォーマンスの違い:通常、コピーするデータを常にスキャンするmemcpyよりも効率的ですstrcpy
于 2017-01-19T18:33:52.290 に答える
2

テストプログラムの問題は、nullで終了する場合printf()、引数の挿入が停止することです。したがって、出力では、おそらく気づいていないでしょう。これは、文字もコピーしたものです。%s\0memcpy()ch

私はGNUglibc-2.24で見たことがありますが、(x86の場合)strcpy()は単に。を呼び出しますmemcpy(dest, src, strlen(src) + 1)

于 2018-02-16T13:18:50.247 に答える
1

printf("%s",...)nullが検出されるとデータの印刷を停止するため、両方の出力は同じです。

次のコードはとを区別strcpymemcpyます:

#include<stdio.h>
#include<string.h>

int main()
{
    char s[5]={'s','a','\0','c','h'};
    char p[5];
    char t[5];
    int i;
    strcpy(p,s);
    memcpy(t,s,5);
    for(i=0;i<5;i++)
        printf("%c",p[i]);
        printf("\n");
    for(i=0;i<5;i++)
        printf("%c",t[i]);

    return 0;
}
于 2020-05-10T05:24:05.087 に答える