首页 C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen

C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen

举报
开通vip

C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlenC语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen 实实C/C++中的字符串操作函是实实功的数很内,实看着实些函实实数很,自己实实起来,实是有实多地方需要考实的,所以立实的朋友没独写,可以自己敲敲看 . --By Crazybabystrcpy: [cpp] view plaincopyprint? 1.char* cb_strcpy(char* dst, const char* src) { 2. 3. assert((dst!=NULL) ...

C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen
C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen 实实C/C++中的字符串操作函是实实功的数很内,实看着实些函实实数很,自己实实起来,实是有实多地方需要考实的,所以立实的朋友没独写,可以自己敲敲看 . --By Crazybabystrcpy: [cpp] view plaincopyprint? 1.char* cb_strcpy(char* dst, const char* src) { 2. 3. assert((dst!=NULL) && (src!=NULL)); 4. 5. char* retAddr = dst; /**< retAddr is in static , char retAddr[] will in Stack, So... */ 6. while ((*(dst++) = *(src++))!='\0') { 7. ; 8. } 9. 10. return retAddr; 11.} strncpy: [cpp] view plaincopyprint? 1.char* cb_strncpy(char* dst, const char* src, size_t size) { 2. 3. assert((dst!=NULL) && (src!=NULL)); 4. 5. char* retAddr = dst; /**< retAddr is in static , char retAddr[] will in Stack, So... */ 6. int i = 0; 7. while (((*(dst++) = *(src++))!='\0') && ((i++) < size)) { 8. ; 9. } 10. 11. *(retAddr+size)='\0'; /**< cut off String */ 12. 13. return retAddr; 14.} 实个strncpy实实版本 和 stdlib.h 下的 strncpy 实是有实的区, 比如 [cpp] view plaincopyprint? 1.char a[30]; 2.strncpy(a, "Hello", 28); //a除了有Hello,之后有会23个repeat '\0' . 实实有效率的会 实实. 3. 4.char b[30]; 5.cb_strncpy(b, "Hello", 28); // 而只有 Hello'\0' CB: strncpy相实于strcpy来实 ,安全性提高了一等实 个. 另个个外一要非常注意的地方那是 strcpy 和 strncpy 都遇到 会'\0' 实束. 外另:当实求的目实地址空实比源字符串空实要小的实候~strncpy 将不再用”\0”来实束字符串。实是一巨大的实患~所以实是不安全个 memcpy Version 1: [cpp] view plaincopyprint? 1.char* cb_memcpyVer1(char* dst, const char* src, size_t size) { 2. 3. assert((dst!=NULL) && (src!=NULL)); 4. 5. char* retAddr = dst; 6. while (size-- > 0) { 7. *(dst++) = *(src++); 8. } 9. return retAddr; 10.} CB: memcpy 和 strncpy 最大的实是 区memcpy不遇到 会'\0' 实束拷实 .memcpy Version 2 : [cpp] view plaincopyprint? 1.char* cb_memcpyVer2(char* dst, const char* src, size_t size) { 2. 3. assert((dst!=NULL) && (src!=NULL)); 4. 5. char* retAddr = dst; 6. size_t i = 0; 7. /* --- 解据重实实决数区叠 --- */ 8. if ((retAddr>src) && (retAddr<(src+size))) { 9. for (i=size-1; i>=0; i--) { 10. *(dst++) = *(src++); 11. } 12. } 13. else 14. { 15. for (i=0; i 0); 18. } 19. 20. return dest; 21.} memset: [cpp] view plaincopyprint? 1.void* cb_memset(void* buffer, int b, size_t size) { 2. 3. assert(buffer!=NULL); 4. char* retAddr = (char*)buffer; 5. while (size-- > 0) { 6. *(retAddr++) = (char)b; 7. } 8. return retAddr; 9.} Memset使用实实区: [cpp] view plaincopyprint? 1.char a[10]; 2.memset(a, 0, sizeof(char)*10); //实操作完全必要个没 因实下面实实存实上要被使用内了。 3.memcpy(a, "Hello", 5); strlen: [cpp] view plaincopyprint? 1.int cb_strlen(const char* str) { 2. 3. assert(str!=NULL); 4. 5. int len = 0; 6. while (*str!='\0') { /**< '\0', stop */ 7. str++; 8. len++ ; 9. } 10. 11. return len; 12.} Recursive strlen: [cpp] view plaincopyprint? 1.int cb_strlen(const char *str) 2.{ 3. if ((str == NULL) || (*str == '\0')) { 4. return 0; 5. } 6. else 7. { 8. return cb_strlen(str+1)+1; /**< Rescursive */ 9. } 10.} strcat: [cpp] view plaincopyprint? 1.char* cb_strcat(char* dst, char* src) { 2. 3. assert(src!=NULL); 4. 5. char* retAddr = dst; 6. /* --- Find last position --- */ 7. while (*dst++ != '\0') { 8. ; 9. } 10. dst--; 11. while (*dst++ = *src++) { 12. ; 13. } 14. return retAddr; 15.} strcmp: [cpp] view plaincopyprint? 1.int cb_strcmp(char* str, char* str2) { 2. 3. assert((str!=NULL) && (str2!=NULL)); 4. 5. char* pStr = str; 6. char* pStr2 = str2; 7. while (*pStr && *pStr2 && (*pStr==*pStr2)) { 8. pStr++; 9. pStr2++; 10. } 11. return (*pStr - *pStr2); /**< 相等实实0 , 前者大于后者大于0, 反之小于0 */ 12.} strchr: [cpp] view plaincopyprint? 1.char* cb_strchr(char* str, char c){ 2. 3. assert(str!=NULL); 4. char* retAddr = str; 5. 6. while (*retAddr!=c) { 7. retAddr++; 8. } 9. if (*retAddr == c) { 10. return retAddr; 11. } 12. else 13. { 14. return NULL; 15. } 16.} 实些字符串操作函实实实要注意实些实实 ,数 1. 需要实实指实的有效性~一般通实直接和NULL实行比实判。来断 2. 函需要能实实行实式操作~也就是实 数char* a = strcpy(b, "Hello"); 3. src的实需要加 const 4. strcnpy 和 memcpy 有 '\0' 判的实断区 5. 内区叠存重实实 , 比如实程序,个 [cpp] view plaincopyprint? 1.int main(void) { 2. char buffer[]="abcdefg"; 3. memcpy(buffer, buffer+2 ,3); //buffer+2(从c实始 实度3个 cde) 4. printf("%s", buffer); 5.} 实实果实个: cdedefg . 再看下面实程序,个 [cpp] view plaincopyprint? 1.int main(void) { 2. char buffer[]="abcdefg"; 3. memcpy(buffer+2, buffer ,3); //如果幸的实你运 出实会 abcab[d]fg 中括是号 随机实 4. printf("%s", buffer); 5.} 实里的memcpy就需要用 memmove的实实方式代替 。来
本文档为【C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_083599
暂无简介~
格式:doc
大小:25KB
软件:Word
页数:9
分类:生活休闲
上传时间:2017-09-25
浏览量:43