日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

memcpy、memmove、memset、memchr、memcmp、strstr详解

發(fā)布時(shí)間:2023/12/1 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 memcpy、memmove、memset、memchr、memcmp、strstr详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第一部分  綜述

memcpy、memmove、memset、memchr、memcmp都是C語(yǔ)言中的庫(kù)函數(shù),在頭文件string.h中。memcpy和memmove的作用是拷貝一定長(zhǎng)度的內(nèi)存的內(nèi)容,memset用于緩沖區(qū)的填充工作,memchr用于字符的查找工作,memcmp用于比較內(nèi)存中緩沖區(qū)的大小。

?

第二部分?  介紹

1、memcpy和memmove

memcpy()--拷貝內(nèi)存內(nèi)容

表頭文件:#include<string.h>或#include<cstring>

定義函數(shù):void *memcpy(void *dst,const void *src,size_t n)

函數(shù)說明:memcpy用來拷貝src所指的內(nèi)存內(nèi)容前n個(gè)字節(jié)到dst所指的內(nèi)存地址上。與strcpy不同的是,memcpy會(huì)完成的復(fù)制n個(gè)字節(jié),不會(huì)遇到字符串結(jié)束'\0'而結(jié)束(strncpy待會(huì)驗(yàn)證)。

返回值:返回指向dst的指針。

附加說明:指src和dst所指的內(nèi)存區(qū)域不可重疊

重疊實(shí)例:

1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int main() 5 { 6 int a[10] = {0}; 7 for (int i = 0; i < 10; i++) 8 a[i] = i; 9 memcpy(&a[4],a,sizeof(int)*6); 10 //memmove(&a[4], a, sizeof(int) * 6); 11 for (int i = 0; i < 10; i++) 12 cout << a[i]; 13 getchar(); 14 return 0; 15 }

會(huì)輸出0123012301,但是vs會(huì)輸出和memmove一樣的結(jié)果0123012345,原因是對(duì)src進(jìn)行了保護(hù),不允許更改。

2、memmove()--拷貝內(nèi)存內(nèi)容

表頭文件:#include<string.h>或#include<cstring>

定義函數(shù):void* memmove(void* dst,const void* src,size_t n)

函數(shù)說明:memmove()與memcpy()一樣都是用來拷貝src所指的內(nèi)存前n個(gè)字節(jié)到dst所指的內(nèi)存上。

不同的是,當(dāng)src和dest所指的內(nèi)存區(qū)域重疊時(shí),memmove仍然可以正確的處理,不過執(zhí)行效率上會(huì)比memcpy略慢。

返回值:返回值指向dst的指針。附加說明:指針src和dst所指的內(nèi)存區(qū)域可以重疊。

3、memset()--設(shè)置內(nèi)存內(nèi)容

表頭文件:#include<memory.h> ?#include<string.h>

函數(shù)說明:memset是C的庫(kù)函數(shù),將s所指向的某一塊內(nèi)存中的前n個(gè)字節(jié)全部設(shè)置成ch制定的ASCII值,塊的大小由第三個(gè)參數(shù)制定,這個(gè)函數(shù)通常為新申請(qǐng)的內(nèi)存做初始化工作。

定義函數(shù):void* memset(void *s,int ch,size_t n)

函數(shù)解釋:將s中前n個(gè)字節(jié)用ch替換并返回s。

作用:在一段內(nèi)存塊中填充某個(gè)給定的值,他是對(duì)較大的結(jié)構(gòu)體或數(shù)組進(jìn)行清零操作的一種最快方法。

返回值:指向s的指針

上面的例子可以改一下

1 int a[10] = {0}; 2 memset(a,0,10);

4、memchr()--查找內(nèi)存內(nèi)容

表頭文件:#include<string.h>

函數(shù)說明:從buf所指內(nèi)存區(qū)的前count個(gè)字節(jié)查找字符ch,當(dāng)?shù)谝淮斡龅阶址鹀h時(shí)停止查找。如果成功,返回指向字符ch的指針;否則返回null

定義函數(shù):extern void* memchr(const void* buf,int ch,size_t count)

代碼實(shí)現(xiàn)

1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int main() 5 { 6 char a[] = "nihao jingliming"; 7 void *p; 8 p = memchr(a,'j',sizeof(a)); 9 if (p) 10 cout << "has found:" << *((char*)p) << endl; 11 else 12 cout << "not found" << endl; 13 getchar(); 14 return 0; 15 }

5、memcmp()--內(nèi)存比較

表頭文件:#include <string.h>

函數(shù)原型:int memcmp(const void* buf1,const void* buf2,unsigned int count)

函數(shù)描述:比較buf1和buf2的前count個(gè)字節(jié)

返回值:當(dāng)buf1<buf2時(shí),返回值<0

    當(dāng)buf1==buf2時(shí),返回值=0

    當(dāng)buf1>buf2時(shí),返回值>0

函數(shù)說明:該函數(shù)是按字節(jié)進(jìn)行比較的

1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int main() 5 { 6 char a[] = "nihao jingliming"; 7 char b[] = "nihao xiaoming"; 8 int r=memcmp(a,b,strlen(a)); 9 if (r>0) 10 cout << "a is big" << endl; 11 else if (r < 0) 12 cout << "b is big" << endl; 13 else 14 cout << "same" << endl; 15 getchar(); 16 return 0; 17 }

?第三部分  實(shí)現(xiàn)

memcpy和memmove

linux內(nèi)核版

1 /** 2 * memcpy - Copy one area of memory to another 3 * @dest: Where to copy to 4 * @src: Where to copy from 5 * @count: The size of the area. 6 * 7 * You should not use this function to access IO space, use memcpy_toio() 8 * or memcpy_fromio() instead. 9 */ 10 void * memcpy(void * dest,const void *src,size_t count) 11 { 12 char *tmp = (char *) dest, *s = (char *) src; 13 while (count--) 14 *tmp++ = *s++; 15 return dest; 16 } 1 /* Normally compiler builtins are used, but sometimes the compiler calls out 2 of line code. Based on asm-i386/string.h. 3 */ 4 #define _STRING_C 5 #include <linux/string.h> 6 #undef memmove 7 void *memmove(void * dest,const void *src,size_t count) 8 { 9 if (dest < src) { 10 __inline_memcpy(dest,src,count); 11 } else { 12 char *p = (char *) dest + count; 13 char *s = (char *) src + count; 14 while (count--) 15 *--p = *--s; 16 } 17 return dest; 18 }

window版

1 void * __cdecl memcpy (void * dst, const void * src, size_t count) 2 { 3 void * ret = dst; 4 5 /* 6 * copy from lower addresses to higher addresses 7 */ 8 while (count--) { 9 *(char *)dst = *(char *)src; 10 dst = (char *)dst + 1; 11 src = (char *)src + 1; 12 } 13 14 return(ret); 15 } 1 void * __cdecl memmove (void * dst, const void * src, size_t count) 2 { 3 void * ret = dst; 4 5 if (dst <= src || (char *)dst >= ((char *)src + count)) { 6 /* 7 * Non-Overlapping Buffers 8 * copy from lower addresses to higher addresses 9 */ 10 while (count--) { 11 *(char *)dst = *(char *)src; 12 dst = (char *)dst + 1; 13 src = (char *)src + 1; 14 } 15 } 16 else { 17 /* 18 * Overlapping Buffers 19 * copy from higher addresses to lower addresses 20 */ 21 dst = (char *)dst + count - 1; 22 src = (char *)src + count - 1; 23 24 while (count--) { 25 *(char *)dst = *(char *)src; 26 dst = (char *)dst - 1; 27 src = (char *)src - 1; 28 } 29 } 30 31 return(ret); 32 }

windows寫的就是分析的更詳細(xì),效率更快。

memset

1 void *(memset) (void *s,int c,size_t n) 2 { 3 const unsigned char uc = c; 4 unsigned char *su; 5 for(su = s;0 < n;++su,--n) 6 *su = uc; 7 return s; 8 }

memchr

1 void *memchr (const void *ptr, int value, int num) 2 { 3 if (ptr == NULL) 4 { 5 perror("ptr"); 6 return NULL; 7 } 8 char * p = (char *)ptr; 9 while (num--) 10 { 11 if (*p != (char)value) 12 p++; 13 else 14 return p; 15 } 16 17 return NULL; 18 }

memcmp

1 /* 因?yàn)轭愋涂梢詾槿我?#xff0c;所以形參應(yīng)為void * 2 * 相等則返回0,否則不為0 3 */ 4 int my_memcmp(const void *s1,const void *s2,size_t count) 5 { 6 int res = 0; 7 const unsigned char *p1 =(const unsigned char *)s1;//注意是unsigned char * 8 const unsigned char *p2 =(const unsigned char *)s2; 9 for(p1 ,p2;count > 0;p1++,p2++,count--) 10 if((res =*p1 - *p2) != 0) //不相當(dāng)則結(jié)束比較 11 break; 12 return res; 13 }

?ststr實(shí)現(xiàn)

1 char* strstr(const char *s1, const char *s2) 2 { 3 int n; 4 if (*s2) 5 { 6 while (*s1) 7 { 8 for (n=0; *(s1 + n) == *(s2 + n); n++) 9 { 10 if (!*(s2 + n + 1)) 11 return (char *)s1; 12 } 13 s1++; 14 } 15 return NULL; 16 } 17 else 18 return (char *)s1; 19 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/jingliming/p/4737409.html

總結(jié)

以上是生活随笔為你收集整理的memcpy、memmove、memset、memchr、memcmp、strstr详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。