相关函数: 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;
}
运行显示:*s = xiaolong
如果注释掉: s[strlen(s)-4] = '\0';
运行显示:*s = xiaolonglong
其实就是:zengxiaolong的指针被这个函数从往后4个后的xiaolong给拷贝到移动到zengxiao,xiaolong==》xiaolonglong,而
这个s[strlen(s)-4] = '\0';就是截断...
memcpy用法:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[] = "xiang dong yang";
char *b;
char c[]="xiang dong yang hello the world";
b=c;
printf("%s\n",c);
memcpy(b,a+6,strlen(a)-6);
//a[strlen(b)-6]='\0';
*(b+9)='\0';
printf("%s",c);
printf("------------\n");
printf("%d",strlen(c));
printf("%c",c[10]);
printf("%c",c[11]);
printf("%c",c[12]);
printf("============\n");
printf("%s",c);
printf("============\n");
printf("%c",*(c+10));//越过\0的截断区域打印一个字符
printf("%c",*(c+11));
printf("%c",*(c+12));
printf("|||||||||||||\n");
printf("%s",c+12);//打印\0截断后的后面字符
printf("|||||||||||||\n");
printf("------------\n");
}
特别注意:printf %c,%s 区别,如下:
表头文件: #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;
}
运行显示:*s = xiaolong
如果注释掉: s[strlen(s)-4] = '\0';
运行显示:*s = xiaolonglong
其实就是:zengxiaolong的指针被这个函数从往后4个后的xiaolong给拷贝到移动到zengxiao,xiaolong==》xiaolonglong,而
这个s[strlen(s)-4] = '\0';就是截断...
memcpy用法:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[] = "xiang dong yang";
char *b;
char c[]="xiang dong yang hello the world";
b=c;
printf("%s\n",c);
memcpy(b,a+6,strlen(a)-6);
//a[strlen(b)-6]='\0';
*(b+9)='\0';
printf("%s",c);
printf("------------\n");
printf("%d",strlen(c));
printf("%c",c[10]);
printf("%c",c[11]);
printf("%c",c[12]);
printf("============\n");
printf("%s",c);
printf("============\n");
printf("%c",*(c+10));//越过\0的截断区域打印一个字符
printf("%c",*(c+11));
printf("%c",*(c+12));
printf("|||||||||||||\n");
printf("%s",c+12);//打印\0截断后的后面字符
printf("|||||||||||||\n");
printf("------------\n");
}
特别注意:printf %c,%s 区别,如下:
printf("%s",pointer p);//指针地址
printf("%c",pointer *p);//指针指向的值
printf("%c",pointer *p);//指针指向的值
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/3732/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2010-11-10 14:34
评论列表