来源于:http://www.interviewsansar.com/2016/01/05/difference-between-strcpy-and-memcpy-in-c-cpp/
memcpy()函数:memcpy函数将指定的字节数从源缓冲区复制到目标缓冲区。实际上,程序员提供要复制的数据的大小。
memcpy()不会检查源缓冲区中的任何终止空字符。其实,它并不关心内存中有什么内容。只要它复制指定的字节数。
strcpy()函数:这个函数将来自源的字符串复制到目标缓冲区,直到它遇到空终止字符,即源字符串中的'\ 0'。
strcpy()的原型:char * strcpy(char * destination,const char * source);
C编程中的strcpy()和memcpy() API的示例。
下面的程序有一个源缓冲区,其中包含一个包含'\ 0'的字符串 - 终止空字符。即:
char source[16]=”interview\0sansar”;
我们在这个字符串中放置了一个空字符来表明strcpy()函数将复制字符串直到找到'\ 0',即拷贝字符串“interview”到目标缓冲区。
而memcpy()会复制整个字节,所以,完整的字符串包括'\ 0'空字符结果输出为“interview \ 0sansar”。
注意:我们已经写了显示函数(它遍历缓冲区的所有内存插槽,读取字符并打印到控制台),以查看strcpy()和memcpy()输出的区别。printf()函数只要找到null字符,它就会停止打印。
下面是我们的代码测试:
//display(): print supplied string on console fetching characters. void display(char* s){ int i = 0; char *temp = s; for (i; i < 16; ++i) { printf("%c", *temp ? *temp : ' '); ++temp; } printf("\n"); } int main() { char source[16]="interview\0sansar"; char str_cpy_destination[16]; char mem_cpy_destination[16]; //intialize buffer to 0, if not buffer will have garbage values. memset(str_cpy_destination, 0, 16); memset(mem_cpy_destination, 0, 16); //Display the source string. display(source); strcpy (str_cpy_destination,source); display(str_cpy_destination); memcpy ( mem_cpy_destination, source, 16); display(mem_cpy_destination); return 0; }
测试输出结果:
interview sansar interview interview sansar
通过上面代码,我们便可以看出strcpy()和memcpy()的区别了。
性能对比:
如果我们必须复制相同数量的字节并且知道要复制的数据的大小,memcpy()函数将会更快。在strcpy的情况下,strcpy()函数逐个复制字符,直到找到NULL或'\ 0'字符。
请注意,如果字符串长度非常小,性能不会有太大区别。 但是,如果我们有大的字符串,可能是从已知大小的文件中读取字符串,在这个时候,我们可以考虑性能。 而如果繁重的字符串处理是在一个循环内,那么我们必须考虑选择strcpy()或memcpy()函数。
文章的脚注信息由WordPress的wp-posturl插件自动生成