Между чем различие 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]
что можно сделать, чтобы увидеть этот эффект
Скомпилируйте и запустите этот код:
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 ()
.
strcpy
останавливается, когда встречает символ NUL ( '\ 0'
), memcpy
- нет. Вы не видите здесь эффекта, поскольку % s
в printf также останавливается на NUL.
Основное отличие состоит в том, что memcpy ()
всегда копирует точное количество байтов, указанное вами; strcpy ()
, с другой стороны, будет копировать, пока не прочитает байт NUL (он же 0), а затем остановится после этого.
Из-за нулевого символа в строке s
, printf
не будет показывать ничего сверх этого. Разница между p
и t
будет в символах 4 и 5. p
не будет иметь их (они будут мусором) и t
будет иметь 'c'
и 'h'
.
strcpy
завершается, когда обнаруживается нулевой признак конца исходной строки. memcpy
требует передачи параметра размера. В случае, который вы представили, оператор printf
останавливается после того, как нулевой терминатор найден для обоих массивов символов, однако вы найдете t [3]
и t [4]
также скопировали в них данные.