и функции 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).