内存操作函数memcpy
格式:void * memcpy(void *dest, const void *source, size_t n)
定义:从存储区source赋值n个字节到存储区dest
注:
-
memcpy可以拷贝除了字符类型的其他数据类型的数据,strcpy只能拷贝字符型数据
-
函数memcpy从source的位置开始向后复制n个字节的数据到dest的内存位置。
-
这个函数在遇到’\0’的时候并不会停下来。
-
如果source和dest有任何重叠,复制的结果都是未定义的。
内存操作函数memmove
格式:void *memmove(void *dest, const void *src, size_t n);
作用:从src复制n个字符到dest,但是在重置内存块这方面,memmove()是比memcpy()更安全的方法。如果目标区域和源区域有重叠的话,memmove()能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和memcpy()函数功能相同。
例子
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *pa = NULL;
char *pb = NULL;
pa = (char *)malloc(sizeof(char)*20);
pb = (char *)malloc(sizeof(char)*30);
memset(pa, 0, sizeof(char)*20);
memset(pb, 0, sizeof(char)*30);
//这样赋值在栈中可以,在malloc申请的堆空间下不行
// pa = "hello world";
// pb = "BSP2208class";
//在堆空间下应该这样赋值
strcpy(pa, "hello world");
strcpy(pb, "BSP2208class");
int i;
// for(i = 0; i < 10; i++)
// {
// pa[i] = 'a'+i;
// }
//
// for(i = 0; i< 20; i++)
// {
// pb[i] = 'A'+i;
// }
memcpy(pb,pa,sizeof(char)*10);
printf("%s\n",pb);
free(pa);
free(pb);
pa = NULL;
pb = NULL;
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *pa = NULL;
char *pb = NULL;
pa = malloc(sizeof(char)*20);
pb = realloc(pa, sizeof(char)*50);
printf("%p\n",pa);
printf("%p\n",pb);
strcpy(pa, "hello world");
strcpy(pb, "BSP2208class");
memmove(pb, pa, sizeof(char)*10);
printf("%s\n", pb);
free(pb);
pb = NULL;
return 0;
}
字符串大写转小写函数strlwr
格式:char *strlwr(char *s1)
作用:将字符串s1中的大写转换为小写,返回s1的值
字符串小写转大写函数strupr
格式:char *strupr(char *s1)
作用:将字符串s1中的小写转换为大写,返回s1的值