и функции 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 ответов:
что можно сделать, чтобы увидеть этот эффект
скомпилируйте и запустите этот код:
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)
.