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找不到。
具有20个字符的数组d,<string.h>中,strlen(d)是18.
strlen()不包含字符串末尾的/0字符。
数组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 是乱码。
验证一下乱码的输出:
如果加上d[strlen(s)]=0;代码如下:
====
挺无语的。
#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;
}
如图:
如果那句话加上,就是输出一个空行的话:
d后面的乱码就不输出了。
===================
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
- extern void * memcpy(void *dest,void *src,unsigned int count)
- 算法17:实现memcpy(void *src, int size, void *dest)
- void* mymemcpy( void* dest, const void* src, size_t count )
- 实现内存复制函数void * memcpy(void *dst,void *src,int count).
- void* memcpy(void* dst, const void* src, int size)
- memcpy函数的使用总结void *memcpy(void *dest, const void *src, size_t n);
- void *memset(void *dest,int c,size_t count)
- memcpy(void*,void*,unsigned int),memset(void*,char,unsigned int),strcpy(char*,char*)
- memicmp(void *buf1, void *buf2, unsigned int count)
- static void PingHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
- 函数(void*)memcpy(void *dest,con…
- 用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。
- 用C语言实现函数void * memmove(void *dest, const void *src, size_t n)
- 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- 用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n)
- 用C语言实现函数void * memmove(void *dest, const void *src, size_t n)
- 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- Allow regions of specific table to be load-balanced
- 马上就要工作了!哦也!
- 引用JS时一点技巧
- Debian Lenny Tips – Install Eclipse
- Android laucher总结
- extern void * memcpy(void *dest,void *src,unsigned int count)
- Android launcher - Launcher(一)
- 在控制台环境下调用MFC DLL崩溃的问题小结
- Android launcher - Workspace
- 我是做.NET产品的。
- ZJUT1099 最少拦截系统
- Ogitor探索之代码分析(1)---OgreWidget::mouseMoveEvent;OgitorsRoot::OnMouseMove
- 福州市申请及实施房屋拆迁工作程序规范
- 一位董事长的37条忠告