关于memcpy、memset、memmove、strcpy、strncpy的使用

一.函数介绍:
1、memcpy
函数原型:extern void *memcpy(void *dest, const void *src, size_t count);
用法:#include<string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
注意:和strcpy相比,memcpy不是遇到’/0’就结束,而是一定会拷贝完n个字节。

函数实现代码:

 1 void *memcpy(void *dest, const void *src, size_t count)
 2 {
 3 
 4      assert(dest!=NULL&&src!=NULL);
 5      char *tmp = dest;
 6      const char *s = src;
 7 
 8      while (count--)
 9      *tmp++ = *s++;
10      return dest;
11 }

 

2、memset
函数原型:extern void *memset(void *s, int c, size_t n)
功能:将已开辟内存空间s的首n个字节的值设为值c。将s中的前n个字符替换为c,并返回s。
memset常用于内存空间的初始化。
memset的深刻内涵:

1)用来对一段内科空间全部设置为某个字符,一般用在对定义的字符串进行初始化为:memset(a, ‘/0’, sizeof(a));

2)也可以方便的初始化结构变量的变量或数组.      

        如:

 

 struct sample_struct
 {  
        char   csName[16];               
        int      iSeq;              
        int       iType;        
};        

 

struct sample_struct   TEST[100];

用memset初始化:

memset( &stTest, 0, sizeof(struct sample_struct) );    
memset( TEST, 0, sizeof(struct sample_struct)*100 );

memset函数实现代码:

1 void * memset(void* buffer, int c, int count) 
2 { 
3      char * buffer_p=(char*)buffer; 
4      assert(buffer != NULL); 
5      while(count-->0) 
6          *buffer_p++=(char)c; 
7      return buffer; 
8 }

 

3、memmove

void *memmove(void *s, const void *ct, size_t n)
与memcpy类似,所不同的是,当对象重叠时,该函数仍能正确执行

 

4、strncpy
函数原型:extern char *strncpy(char *dest, char *src, int n); 
用法:#include <string.h>

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
        如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
        如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
        src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针(该指向dest的最后一个元素)
实现代码:

1 char * strncpy(char * dest,const char *src,size_t count)
2 {    
3     char *tmp = dest;
4     while (count-- && (*dest++ = *src++) != '/0')
5     /* nothing */;
6     return tmp;
7 }

 

5、strcpy:

函数原型:extern char *strcpy(char *dest,char *src);

头文件:string.h

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。如果src的结尾不是'/0'的话,那么系统会在src的结尾处自动加一个'/0'。例如:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void main()
 5 {
 6  char array1[5]={'1','2','3','4','5'};
 7  char array2[5]={'a','b','c'};
 8  strcpy(array1,array2);
 9  printf("%s/n",array1);
10 }
11 
12 输出结果:abc

 

函数实现代码:

1 char *strcpy(char *strDest, const char *strSrc) 
2 { 
3      assert((strDest!=NULL) && (strSrc !=NULL)); 
4      char *address = strDest;     
5      while( (*strDest++ = * strSrc++) != '/0') 
6         NULL ; 
7      return address ;       
8 }
posted @ 2012-08-03 00:36  beforus  阅读(288)  评论(0编辑  收藏  举报