实战,让学习更简单     全国咨询热线:400-009-1906

北京 切换校区

全国24小时免费热线

400-009-1906

深入理解可以复制数组的库函数strcpy()和memcpy()的一些细节

时间:2018-12-03   来源:尚学堂   阅读:69
首页> 深入理解可以复制数组的库函数strcpy()和memcpy()的一些细节

  数组不支持赋值的集合操作,也就是不能把一个数组赋给另一个数组,需要通过循环把数组中的每个元素赋给另一个数组相应的元素。但可以通过string.h中的库函数来进行类似功能的处理,strcpy()和strncpy()函数可以处理字符数组,memcpy()和memmove()函数提供类似的方法处理任意类型的数组。

  strcpy()是一种C语言的标准库函数,strcpy是stringcopy的缩写。

char*strcpy(char*dest,constchar*src);

  从src地址开始拷贝包括''结束符在内的字符串到以dest开始的地址空间,返回值的类型为char*。

  memcpy()是c和c++使用的内存拷贝函数,memcpy是memorycopy的缩写。

void*memcpy(void*restrictdest,constvoid*restrictsrc,size_tcount);

  从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

  strcpy()复制包括字符串的结束符''在内的字符数组。

  memcpy()提供了一般内存的复制,即memcpy对于需要复制的内容没有限制,因此用途更广。

  另两个功能相似、但接口不同的函数:

  char*strncpy(char*dest,constchar*src,intn);

  把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。

  void*memmove(void*dest,constvoid*src,size_tcount);

  memmove()用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,拷贝过程类似于先把字节拷贝到一个临时缓冲区,然后再拷贝到最终目的地,但复制后src内容会被更改。与memmove()不同的是,memcpy是假设两个内存区域之间没有重叠,如果有重叠,则其行为是未定义的,这意味着函数有可能会失败。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

  memcpy()和memmove()两个函数被设计用于处理任何数据类型,所以它们的参数都是两个指向void的指针。C允许把任何类型的指针赋给void*类型的指针。如此宽容导致函数无法知道待拷贝数据的类型。因此,这两个函数使用第3个参数指明待拷贝的字节数。注意,对数组而言,字节数一般与元素个数不同。如果要拷贝数组中10个double类型的元素,要使用10*sizeof(double),而不是10.

  下面是strcpy()的小实例代码:

char*strcpy(char*des,constchar*source)

{

char*r=des;

assert((des!=NULL)&&(source!=NULL));

while((*r++=*source++)!='');

returndes;

}

  下面是memcpy()和memmove()使用的小实例:

C|深入理解可以复制数组的库函数strcpy()和memcpy()的一些细节

  运行结果:

memcpy()used:

values(originaldata):

12345678910

target(copyofvalues):

12345678910

Usingmemmove()withoverlappingranges:

values--elements0-5copiedto2-7:

12123458910

Usingmemcpy()tocopydoubletoint:

target--5doublesinto10intpositions:

0107374182401091070464536870912

110851695920251638401143320349-20126965401179618799

  程序中最后一次调用memcpy()从double类型数组中把数据拷贝到int类型数组中,这演示了memcpy()函数不知道也不关心数据类型,它只负责从一个位置把一些字节拷贝到另一个位置(例如,从结构中拷贝数据到字符数组中)。而且,拷贝过程中也不会进行数据转换。

  附代码:

#include

#include

#include

#defineSIZE10

voidshow_array(constintar[],intn);

intmain()

{

intvalues[SIZE]={1,2,3,4,5,6,7,8,9,10};

inttarget[SIZE];

doublecurious[SIZE/2]=

{2.0,2.0e5,2.0e10,2.0e20,5.0e30};

puts("memcpy()used:");

puts("values(originaldata):");

show_array(values,SIZE);

memcpy(target,values,SIZE*sizeof(int));

puts("target(copyofvalues):");

show_array(target,SIZE);

puts("

Usingmemmove()withoverlappingranges:");

memmove(values+2,values,5*sizeof(int));

puts("values--elements0-5copiedto2-7:");

show_array(values,SIZE);

puts("

Usingmemcpy()tocopydoubletoint:");

memcpy(target,curious,(SIZE/2)*sizeof(double));

puts("target--5doublesinto10intpositions:");

show_array(target,SIZE/2);

show_array(target+5,SIZE/2);

system("pause");

return0;

}

voidshow_array(constintar[],intn)

{

inti;

for(i=0;i<n;i++)

printf("%d",ar[i]);

putchar('

');

}

相关资讯

  • 北京校区
  • 山西校区
  • 郑州校区
  • 武汉校区
  • 四川校区
  • 长沙校区
  • 深圳校区
  • 上海校区
  • 广州校区
  • 保定招生办

北京海淀区校区(总部):北京市海淀区西三旗街道建材城西路中腾建华商务大厦东侧二层尚学堂
北京京南校区:北京亦庄经济开发区科创十四街6号院1号楼 赛蒂国际工业园
咨询电话:400-009-1906 / 010-56233821
面授课程: JavaEE培训大数据就业班培训大数据云计算周末班培训零基础大数据连读班培训大数据云计算高手班培训人工智能周末班培训人工智能+Python全栈培训H5+PHP全栈工程师培训

山西学区地址:山西省晋中市榆次区大学城大学生活广场万科商业A1座702
咨询电话:0354-3052381 / 18903441162

郑州学区地址:金水区东风路经三路北100米注协大厦10楼
咨询电话:0371-55177956 

武汉学区地址:湖北省武汉市江夏区江夏大道26号 宏信悦谷创业园4楼
咨询电话:027-87989193

四川学区地址:成都市高新区锦晖西一街99号布鲁明顿大厦2栋1003室
咨询电话:028-65176856 / 13880900114

长沙学区地址:长沙市岳麓区麓源路湖南电子商务基地5楼(公交车站:六沟垅)
咨询电话:0731-83072091

深圳校区地址:深圳市宝安区航城街道航城大道航城创新创业园A4栋210(固戍地铁站C出口)
咨询电话:0755-23061965 / 18898413781

上海尚学堂松江校区地址:上海市松江区荣乐东路2369弄45号绿地伯顿大厦2层
咨询电话:021-67690939

广州校区地址:广州市天河区元岗横路31号慧通产业广场B区B1栋6楼尚学堂(地铁3号线或6号线到“天河客运站”D出口,右拐直走约800米)
咨询电话:020-2989 6995

保定招生办公室

地址:河北省保定市竞秀区朝阳南大街777号鸿悦国际1101室

电话:15132423123

Copyright 2006-2018 北京尚学堂科技有限公司  京ICP备13018289号-19  京公网安备11010802015183  
媒体联系:18610174079 闫老师  

有位老师想和您聊一聊