C语言中的库函数memcpy、memmove、memset、memch…

2018-06-27 10:02:16来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

  memcpy、memmove、memset、memchr、memcmp都是C语言中的库函数,在头文件string.h中。memcpy和memmove的作用是拷贝一定长度的内存的内容,memset用于缓冲区的填充工作,memchr用于字符的查找工作,memcmp用于比较内存中缓冲区的大小。

1.void * memcpy ( void * dest, const void * src, size_t num );

功能:将以src作为起始地址的数据复制num个字节到以dest为起始地址的数据中,不支持dest和src重叠的情况。函数返回dest指针。

2.void * memset ( void * ptr, int value, size_t num );

功能:将以ptr作为起始地址的数据的num个字节设置为value。函数返回destination指针。

3.void * memmove ( void * dest, const void * source, size_t num );

功能:功能:将以source作为起始地址的数据的num个字节移动到以destination为起始地址的数据中,支持dest和src重叠的情况。函数返回dest指针。

4.int memcmp ( const void * ptr1, const void * ptr2, size_t num );

功能:比较以ptr1为起始地址数据和以ptr2为起始地址的数据的num个字节大小情况。如果num个字节都相等,则相等,函数返回0。从起始位置开始,如果某个字节大,则prt1>ptr2,函数返回正数,否则ptr<ptr2,函数返回负数。

5.void * memchr (const void * ptr, int value, size_t num ); 

功能:在以ptr作为起始地址的数据中的num个字节中查找value,如果查到,则返回value所在的地址,否则返回NULL。

例子:

  1 #include<iostream>
  2 #include<assert.h>
  3// #include<string.h>
  4 using namespace std;
  5 void * memcpyy ( void * dest, const void * src, size_t num )
  6 {
  7     char* pdes = (char*)dest;
  8     char* psrc = (char*)src;
  9     assert(dest !=NULL && src !=NULL && num>0);
 10     while(num--)
 11         *pdes++ = *psrc++;
 12     return dest;
 13 }
 14 
 15 void * memmovee ( void * dest, const void * src, size_t num )
 16 {
 17     char* pdes = (char*)dest;
 18     char* psrc = (char*)src;
 19     assert(dest !=NULL && src !=NULL && num>0);
 20     //判断dest和src是否存在重叠
 21     if(pdes+num <psrc || psrc+num < pdes)  //不存在重叠,正常从前向后复制
 22         while(num--)
 23             *pdes++ = *psrc++;
 24     else //存在重叠,防止信息丢失,从后向前复制
 25     {
 26         pdes = pdes+num-1;
 27         psrc = psrc+num-1;
 28         while(num--)
 29             *pdes-- = *psrc--;
 30     }
 31     return dest;
 32 }
 33 
 34 int memcmpp ( const void * ptr1, const void * ptr2, size_t num )
 35 {
 36 
 37     int ret = 0;
 38     const char* ptmp1 = (char*)ptr1;
 39     const char* ptmp2 = (char*)ptr2;
 40     assert(ptr1 != NULL && ptr2 != NULL && num>0);
 41     while(num--)
 42     {
 43         if(*ptmp1 > *ptmp2)
 44         {
 45             ret = 1;
 46             break;
 47         }
 48         if(*ptmp1 < *ptmp2)
 49         {
 50             ret = -1;
 51             break;
 52         }
 53         ptmp1++;
 54         ptmp2++;
 55     }
 56     return ret;
 57 }
 58 
 59 const void * memchrr (const void * ptr, int value, size_t num )
 60 {
 61     char* pret = NULL;
 62     char* ptmp = (char*)ptr;
 63     assert(ptr !=NULL && num>0);
 64     while(num)
 65     {
 66         if(*ptmp == value)
 67         {
 68             pret = ptmp;
 69             break;
 70         }
 71         ptmp++;
 72         num--;
 73     }
 74     return pret;
 75 } 
 76 void * memset ( void *ptr, int value, size_t num )
 77 {
 78     char* ptmp = (char*)ptr;
 79     assert(ptr !=NULL && num >0);
 80     while(num--)
 81         *ptmp++ = (char)value;
 82     return ptr;
 83 }
 84 int main()
 85 {
 86     char *pch;
 87     int a[10] = {1,2,3,4,5,6,7,8,9,0};
 88     int b[10]={1,2,3,4,5,6,7,8,9,0};
 89     char arr[10]={'1','2','3','4','5','6','7','8','9','0'};
 90     memcpy(&a[4],a,sizeof(int)*6);
 91     for (int i = 0; i < 10; i++)
 92         cout << a[i];
 93     cout<<endl;
 94 
 95     memmovee(&a[4], a, sizeof(int) * 6);
 96     for (int i = 0; i < 10; i++)
 97         cout << a[i];
 98     cout<<endl;
 99      
100     cout<<memcmpp (a,b,4)<<endl;
101 
102     pch=(char*)memchrr(arr,'6',10);
103     if(pch!=NULL)
104         cout<<"'6'found at position:"<<(pch-arr+1)<<endl;
105     else
106         cout<<"no found"<<endl;
107 
108     memset(arr,'a',5);
109     for (int i = 0; i < 10; i++)
110         cout << arr[i];
111     cout<<endl;
112     return 0;
113 }

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:(维护)高精模板(缺除法)

下一篇:POJ 2987 Firing