模拟实现字符串操作函数

来源:互联网 发布:盘古数据 招聘 编辑:程序博客网 时间:2024/05/29 03:52

模拟实现1.strcpy 2.strcat 3.strstr 4.strchr 5.strcmp 6.memcpy 7.memmove

1.strcpy:将源字符串拷贝到目标字符串中

注意检查所传指针的有效性,源字符串中的‘\0’也一同拷贝。

char *my_strcpy(char *dest,const char *src){char *ret = dest;//先保存一个指向第一个字符的指针assert(dest);assert(src);while((*dest++ = *src++)){;}return ret;}

2.strcat 目标字符串末尾拼接字符串


char *my_strcat( char *dest,const char *src){char *ret = dest;assert(dest);assert(src);while(*dest){dest++;//dest没到最后}while(*dest++ = *src++){;//dest到了最后}return ret;}


3.strstr 在目标字符串中查找子串并返回一个指向子串在目标字符串中第一次出现的位置的指针,

若没找到则返回NULL

char *my_strstr(const char *dest,const char *src){char *cp = (char *)dest;char *substr = (char *)src;char *p = NULL;assert(dest);assert(src);if(*src == '\0'){return NULL;}while(*cp){p = cp;substr = src;while(*p && *substr && (*p == *substr)){p++;substr++;//1.循环在p中找,后一个是不是也是substr中的2.都不为‘\0’接着向后}if(*substr == '\0')return cp;cp++;//没有相同的cp向后}return NULL;//没找到}



4.strchr 在目标字符串中查找指定字符的位置,若找到则返回指向第一次出现指定字符的指针,若找不到返回NULL。


char *my_strchr(const char *dest,int c){assert(dest);while(*dest != '\0'){if(*dest == c){return dest;}dest++;}return NULL;}


5.strcmp 比较两字符串大小,一直比较直到遇到不同的字符或某个字符串结束。
返回值

<0 字符串1小于字符串2(不一定是-1)

=0两字符串相等

>0 字符串1大于字符串2(不一定是1)

int my_strcmp(const char*src,const char *dest){assert(src);assert(dest);while(*dest == *src)//dest和src都没到末尾或遇到相等的元素{if(*src == '\0'){return 0;}dest++;src++;}if(*src >*dest)return 1;elsereturn -1;}

5.memcpy 在缓冲区中按字节拷贝。

注意void *要转为(char *)。

void *my_memcpy(void *dest,const void *src,size_t count){void *ret = dest;while(count--){*(char *)dest = *(char *)src;dest = (char *)dest +1;src = (char *)src +1;}return ret;}


6.memmove 从src开始连续拷贝count个字节到dest中作用与memcpy相同,

但当内存局部重叠(特别是第二种情况)时memmove就能保证拷贝结果正确,而memcpy则不能。


因为内存重叠src最右的两个字节会被覆盖,不能正常拷贝。故采用从后向前拷贝的方式。


void *my_memmove(void *dest,const void*src,size_t count){void *ret = dest;char *ptr_dest = (char *)dest;const char *ptr_src = (const char *)src;if(dest <= src || (char *)dest >= (char *)src+count){while(count--){*ptr_dest++ = *ptr_src++;}}else if(ptr_src>ptr_dest)//从后向前拷贝{ptr_src += count - 1;ptr_dest += count - 1;while(count--){*ptr_dest-- = *ptr_src--;}}return dest;}

请多指正啦~


原创粉丝点击