题目要求
1.strcpy/memcpy/memmove;
2.memset函数;
3.字符串处理函数。
题目分析
1.接口定义:
char * strcpy(char * dest, const char * src);
void *memcpy(void *memTo, const void *memFrom, size_t size);
void *memmove(void *dst,const void *src,size_t n);
函数区别:
-->strcpy 和 memcpy主要有以下三方面的区别:
i)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。
ii)复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符" ”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。
iii)用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。
-->memcpy和memmove区别:当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
代码实现
char * strcpy(char * dest, const char * src) // 实现src到dest的复制 { if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性 { return NULL; } char *strdest = dest; //保存目标字符串的首地址 while ((*strDest++ = *strSrc++)!=' '); //把src字符串的内容复制到dest下 return strdest; } void *memcpy(void *memTo, const void *memFrom, size_t size) { if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效 return NULL; char *tempTo = (char *)memTo; //保存memTo首地址 while(size -- > 0) //循环size次,复制memFrom的值到memTo中 *tempTo++ = * memFrom ++ ; return memTo; } void *memmove(void *dst,const void *src,size_t n) { char *dp = (char *)dst; char *sp = (char *)src; if(dst==NULL || src==NULL)return NULL; //非重叠 //dp < sp //dp > (sp+n) if(sp>dp||(sp+n)<dp) { while(n--) *(dp++) = *(sp++); } else if(sp<dp)//重叠 (此时条件 sp<dp<(sp+n))如果sp==dp则快速的返回 {//反向拷贝 sp += n; dp += n; while(n--) *(--dp) = *(--sp); } return dst; }
void * myMemset(void *ptr,int c,size_t count) { void * start = ptr; if(ptr==NULL) return NULL; while(count--) { *( char *)ptr = (char )c; ptr = ( char *)ptr + 1; //不转换的话,加1就不清楚就加多少了 } return start; }
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> int mystrlen(const char *str); int main(void) { char *b = "hellp"; printf("%d ",mystrlen(b)); return 0; } int mystrlen(const char *str) { int len; assert(str != NULL); len = 0; while (*str ++ != '