模拟实现C语言库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

来源:互联网 发布:淘宝绑定支付宝 编辑:程序博客网 时间:2024/05/21 06:36

C语言库函数实现练习

1.模拟实现strcpy

strcpy是字符串复制函数,把从src(源字符串指针)地址开始且含有’\0’结束符的字符串复制到以dest(目的字符串指针)开始的地址空间。
注意:在进行复制时是连字符串结束标识符‘\0’一并复制
只能拷贝字符串。

#include<stdio.h>  #include<assert.h>  char *my_strcpy(char *dst, const char *src)  {      char *start = dst;               assert(dst != NULL);           assert(src != NULL);      while (*dst++ = *(char*)src++)          {          ;      }      return start;      //返回起始地址  }  int main()  {      char arr1[20] = "Helloween";      char arr2[] = "Hello";      char *p = my_strcpy(arr1, arr2);      printf("%s\n", p);      return 0;  }  

2.模拟实现strcat

strcat是用于字符串连接的函数,会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
注意:dest 与 src 所指的内存空间是不能重叠的,并且dest 要有足够的空间来容纳要复制的字符串。

#include<stdio.h>#include<assert.h>char *my_strncat(char *dst, const char *src, size_t n)  {      char *start = dst;      assert(dst != NULL);      assert(src != NULL);      while (*dst)      {          dst++;      }      while (n--)      {          *dst++ = *(char*)src++;      }      return start;  }  int main()  {      char arr1[60] = "Hello, ";      char arr2[] = "world";      char *p = my_strncat(arr1, arr2, 5);      printf("%s\n", p);      return 0;  }  

3.模拟实现strstr

strstr是从字符串str1中查找是否有字符串str2函数。如果str2是str1的子串,确定子串在str1中第一次出现的位置,返回这个位置的地址。
如果不是子串,返回NULL。

#include<stdio.h>#include<assert.h>#include<stdlib.h>char * my_strstr(char * dest, char * src){    char *p = dest;    char *s1 = p;    char *s2 = src;    assert(dest);    assert(src);    while (*s1)    {        s1 = p;        s2 = src;        while ((*s1!='\0')&&(*s2 != '\0'))        {            if (*s1++ == *s2++)            {                ;            }            else            {                    p++;                break;            }        }        if (*s2 == '\0')        {            return p;        }        }}int main(){    char *str1 = "hellow,world";    char *str2 = "world";    char *ret = my_strstr(str1, str2);    printf("%s\n", ret);    system("pause");    return 0;}

4.模拟实现strchr

strchr是查找字符串s中首次出现某个字符的位置。返回某字符首次出现的位置,如果字符不存在,返回NULL。

#include<stdio.h>#include<stdlib.h>#include<assert.h>char*my_strchr(const char *string,char c){    int i = 0;    assert(string);    while (*string!=NULL)    {        if (*string == c)        {            return string;        }        else        {            string++;        }    }    return NULL;}int main(){    char*arr = "hellow";    char p = 'o';    char *ret = my_strchr(arr, p);    printf("%s", ret);    return 0;}

5.模拟实现strcmp

strcmp是比较两个字符串,若str1==str2,返回0。若str1

#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(const char *s1, const char *s2){    assert(s1);    assert(s2);    while ((*s1 == *s2) && (*s1 != '\0'))    {        s1++;        s2++;    }    return *s1 - *s2;}int main(){    int ret = 0;    char str1[40] = "helloworld";    char str2[20] = "world";    ret = my_strcmp(str1, str2);    printf("%d\n", ret);    system("pause");    return 0;}

6.模拟实现memcpy

memcpy是内存拷贝函数,是将N个字节的源内存地址的内容拷贝到目标内存地址中。
拷贝时会有一个变量size控制。memcpy和strcpy不同,它可以拷贝任意内容。而且strcpy复制时不指定长度,有可能会溢出。
注意!使用memcpy时要保证源和目标的内存区域不能重叠

#include <stdio.h>  #include<stdlib.h> void * my_memcpy(void * dst, const void * src, int count)  {      void *ret = dst;      while (count--)      {          *(char *)dst = *(char *)src;          dst=(char *)dst+1;          src=(char *)src+1;      }      return ret;  }  int main()  {      char p[] = "hellow";       char *a = "hi";      my_memcpy(p, a, 2);      printf("%s\n", p);      return 0;  }  

memmove也是内存拷贝函数,和memcpy的作用是一样的,区别是,当内存发生局部重叠的时候memmove
可以保证拷贝结果正确,memcpy不能保证结果正确。

这种情况,不存在内存重叠,memcpy和memmove都可以保证结果正确。
这种情况,不存在内存重叠,memcpy和memmove都可以保证结果正确。

这种情况下,拷贝的内容已经被覆盖,用memmove可以保证结果正确。
这种情况下,拷贝的内容已经被覆盖,用memmove可以保证结果正确。

7.模拟实现memmove

#include <stdio.h>  #include <assert.h>void * memmove(void * dst, const void * src, int count)  {      void * ret = dst;      assert(dst);      assert(src);      if (dst <= src || (char *)dst >= ((char *)src + count))         {          while (count--)           {              *(char *)dst = *(char *)src;              dst = (char *)dst + 1;              src = (char *)src + 1;          }      }      else                                                         {          dst = (char *)dst + count - 1;          src = (char *)src + count - 1;          while (count--)           {              *(char *)dst = *(char *)src;              dst = (char *)dst - 1;              src = (char *)src - 1;          }      }      return ret;  }  int main()  {      char p[] = "hello!";      char *q = "world";      memmove(p, q,strlen(q)+1 );      printf("%s\n", p);      return 0;  }  
阅读全文
0 0
原创粉丝点击