strcpy по сравнению с memcpy

Между чем различие 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]
69
задан Ayxan 23 May 2019 в 22:31
поделиться

5 ответов

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

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

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

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

117
ответ дан 24 November 2019 в 13:36
поделиться

strcpy останавливается, когда встречает символ NUL ( '\ 0' ), memcpy - нет. Вы не видите здесь эффекта, поскольку % s в printf также останавливается на NUL.

71
ответ дан 24 November 2019 в 13:36
поделиться

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

2
ответ дан 24 November 2019 в 13:36
поделиться

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

3
ответ дан 24 November 2019 в 13:36
поделиться

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

12
ответ дан 24 November 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: