и функции memcpy и strcpy


в чем разница между memcpy() и strcpy()? Я пытался найти его с помощью программ, но оба дают тот же результат.

int main()
{
    char s[5]={'s','a','','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]
8 61

8 ответов:

что можно сделать, чтобы увидеть этот эффект

скомпилируйте и запустите этот код:

void dump5(char *str);

int main()
{
    char s[5]={'s','a','','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

вы можете видеть, что "ch" был скопирован memcpy(), а не strcpy().

strcpy останавливается, когда он сталкивается с нулем, memcpy нет. Вы не видите эффекта здесь, как %s в printf также останавливается на нуле.

strcpy завершается, когда найден нулевой Терминатор исходной строки. memcpy требуется передать параметр размера. В случае, если вы представили printf оператор останавливается после того, как нулевой Терминатор найден для обоих массивов символов, однако вы найдете t[3] и t[4] скопировал данные в них.

strcpy копирует символ из источника в пункт назначения один за другим, пока он не найдет символ NULL или '\0' в источнике.

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

где memcpy копирует данные (не символьные) из источника в пункт назначения заданного размера n, независимо от данных в источнике.

memcpy следует использовать, если вы хорошо знаете, что источник содержит другие символы. для зашифрованных данных или двоичных данных, memcpy является идеальным способом пойти.

strcpy считается устаревшей, поэтому используйте strncpy.

из-за нулевого символа в вашей строке s printf не будет показывать ничего, кроме этого. Разница между p и t будет заключаться в символах 4 и 5. у p их не будет (они будут мусором), а у t будут " c " и "h".

основное различие заключается в том, что memcpy() всегда копирует точное количество байтов, которые вы указываете; strcpy (), с другой стороны, будет копировать, пока он не прочитает байт NUL (aka 0), а затем остановится после этого.

  • разница в поведении:strcpy останавливается, когда он встречает NULL или ''
  • разница в производительности: memcpy обычно более эффективен, чем strcpy, который всегда сканировать копии

проблема с вашей тестовой программой заключается в том, что printf() останавливает вставку аргумента в %s, когда он сталкивается с нулем . Так что в вашем выходе вы, наверное, не заметили, что memcpy() скопировать символы c и h как хорошо.

Я видел в GNU glibc-2.24, что (для x86) strcpy() просто называет memcpy(dest, src, strlen(src) + 1).