extern void * memcpy(void *dest,void *src,unsigned int count)

来源:互联网 发布:javascript犀牛书pdf 编辑:程序博客网 时间:2024/04/30 15:19

 原型:extern void *memcpy(void *dest, void *src, unsigned int count);

  用法:#include <string.h>
   
  功能:由src所指内存区域复制count个字节到dest所指内存区域。
   
  说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
   
  举例:

 

 

   clrscr()在 #include <syslib.h>中。但是gcc找不到。

devc++ 运行结果

 

具有20个字符的数组d,<string.h>中,strlen(d)是18.

strlen()不包含字符串末尾的/0字符。

memcpy1

 

 

 

 

数组d的大小

 

数组d 的大小,在    d[strlen(s)]=0; 之前,都是23.之后是18

s一直是18。

 

这是怎么回事呢?

 

 

 

 

,

char d[20] ,大小为啥是23呢?

char *s="Golden Global View";  字符串里头一共有18个字符。不算‘/0’

不加    d[strlen(s)]=0; 这句话,d 的19 20 是乱码。

 

验证一下乱码的输出:

 

 

 

4

 

 

如果加上d[strlen(s)]=0;代码如下:

 

5

 

====

挺无语的。

 

  #include <string.h>

 

  main()

  {

     char *s="Golden Global View";

     char d[20];

     printf("at first , strlen(d)=%d  ,strlen(s)=%d/n",strlen(d),strlen(s));

     memcpy(d,s,strlen(s));

     printf("after memcpy , strlen(d)=%d  ,strlen(s)=%d/n",strlen(d),strlen(s));

     d[strlen(s)]=0;

     printf("d is :%s",d);

    // printf("/n");  这句话如果不加,就会全部输出d

   int i; 

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

   {

       printf("%d=%c/n",i,d[i]);

   }

       system("pause");

      return 0;

  }

如图:

6

 

 

如果那句话加上,就是输出一个空行的话:

d后面的乱码就不输出了。

7

===================

memcpy函数的一般调用方法为"memcpy(dest,src,n);".
其功能为把源串src中前n个字符拷贝到目的串dest中,因此目的串dest的最后长度应是n.

当目的串为空或目的串原来的长度不大于n时,memcpy的结果是正确的,

而当目的串原来的长度大于n时则调用memcpy函数后得到的结果是错误的,

如例2所示.
例2.编制memcpy函数演示程序

本程序输出结果应为:Target string 1 is:First
Target string 2 is:Sec
Target string 3 is:Second
但实际输出结果却是:Target string 1 is:First
Target string 2 is:Secst
Target string 3 is:Second
显然,如此调用memcpy函数有时会得到错误的结果.若用如下语
句代替"memcpy(dest,src,n);"语句,即可得到正确的结果.


当然,也可自编一memcpy函数以代替库函数memcpy,由于篇幅所
限,就不给出笔者自编的memcpy函数.与memcpy函数存在同样问题的
函数还有memmove函数,经过上述方法处理后亦可获得正确结果.

http://blog.pfan.cn/vfdff/38079.html