相关函数: bcopy(), memccpy(), memcpy(), strcpy(), strncpy()
表头文件: #include <string.h>
定义函数: void *memmove(void *dest, const void *src, size_t n);
函数说明: memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。
返回值: 返回指向dest的指针。
附加说明: 指针src和dest所指的内存区域可以重叠。
memcpy()、 memmove()和memccpy()
-------------------------------------------------------
这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。
对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所以可以安全地使用memcpy()函数。
-------------------------------------------------------
#include <string.h>
#include <stdio.h>
int main()
{
char s[] = "zengxiaolong";
memmove(s, s+4, strlen(s)-4);
s[strlen(s)-4] = '\0';
printf("*s = %s\n", s);
return 0;
}
贴个VC下的源码看看:
void * __cdecl memmove ( void * dst, const void * src, size_t count )
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
/*
* Non-Overlapping Buffers
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
/*
* Overlapping Buffers
* copy from higher addresses to lower addresses
*/
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
void * memmove(void * dest,const void *src,size_t count)
{
char *tmp, *s;
if (dest <= src) {
tmp = (char *) dest;
s = (char *) src;
while (count--)
*tmp++ = *s++;
}
else {
tmp = (char *) dest + count;
s = (char *) src + count;
while (count--)
*--tmp = *--s;
}
return dest;
}
memmove(拷贝内存内容)
相关函数 bcopy,memccpy,memcpy,strcpy,strncpy
表头文件 #include<string.h>
定义函数 void * memmove(void *dest,const void *src,size_t n);
函数说明 memmove()与memcpy()一样都是用来拷贝src 所指的内存内容前n 个字节到dest 所指
的地址上。不同的是,当src 和dest 所指的内存区域重叠时,memmove()仍然可以正确
的处理,不过执行效率上会比使用memcpy()略慢些。
返 回 值 返回指向dest 的指针。
附加说明 指针src 和dest 所指的内存区域可以重叠。
*/
#if 1
#include <string>
#include <iostream>
#include <stdio.h>
//using namespace std::cout; //error C2867: 'std::cout' : is not a namespace
//using namespace std::endl; //error C2867: 'std::endl' : is not a namespace
using namespace std;
void main()
{
void *s = "ddddddddd ddddd";
//char str1[20] = "asdfghjkldasdfghjkl";
char str1[20] = "asdfghjkldasdf";
//char str2[20] = '0' ; //error C2440: 'initializing' : cannot convert from 'const char' to 'char [20]'
//char str2[20] = {} ;//{0} ; //error
char str2[20] = {0} ; //字符数组初始化为空 char a[4] = {0} ; char a[4] == "0"如果定义一个字符数
组,却没有初始化,则数组输出乱麻
//void *memmove(void *,const void *,size_t)
cout<<"copy from s to str1 "<<endl;
memmove(str1,s,strlen((char *)s)); //遇到空格继续 ,字符指针---〉字符数组
cout<<"str1 is "<<str1<<endl;
memmove(str2,str1,strlen(str1)); //字符数组-----〉字符数组
cout<<"str2 is "<<str2<<endl;
cout <<"copy from str1 to s ,lenght is strlen(str1) "<<endl;
//memmove(s,str1,strlen(str1)); //字符数组----〉字符指针 运行时显示工程出现问题,需要关闭
//memmove(s,(void *)str1,strlen(str1)); //字符数组----〉字符指针 运行时显示工程出现问题,需要关闭
cout<<"s is "<<s<<endl;
cout<<"(char *)s is "<<(char *)s<<endl;
//memmove(s,str1,sizeof(str1));
//cout<<"s is "<<s<<endl;
}
/*
输出结果:
copy from s to str1
str1 is ddddddddd ddddd
str2 is ddddddddd ddddd
copy from str1 to s ,lenght is strlen(str1)
s is 0046F0C0
(char *)s is ddddddddd ddddd
*/
/*
把一个字符数组清空的最快的办法是把他的第一个字符的值设为0。
也就是 a[0]=0;
a[0]='\0';
a[0]=NULL;
如何判断一个字符数组是空数组
char aaa[10];
if((aaa[0]=='\0') || strlen(aaa)==0)
{
//为空
}
*/
#endif