模拟实现strlen,strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

1.实现strcpy (把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间)
2.实现strcat (把src字符串接到dest字符串的后面)
3.实现strstr (判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。)
4.实现strchr (可以查找字符串s中首次出现字符c的位置)
5.实现strcmp (判断两个字符串dst和src是否相同,相同返回0 ,dst大于src返回-1,小于返回1)
6.实现memcpy (从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。)
7.实现memmove (从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。(可重叠))
8.实现strlen(字符串或数组长度)

#include<stdio.h>
#include<assert.h>
int my_strlen(char *q)
{
    char *ret = q;
    assert(q != NULL);
    while(*q != '\0')
        q++;
    return q-ret;

}
char *my_strcpy(char *dest, const char*src)
{
   char*p = dest;
   assert(dest != NULL);
   assert(src != NULL);
   while(*dest++ = *src++)
   {
      ;
   }
   return p;
}
char *my_strcat(char *dest, const char *src)
{
    char *p = dest;
    assert(dest != NULL);
    assert(src != NULL);
    while(*dest)
        dest++;
    while(*dest++ = *src++)
    {   
        ;
    }

   return p;

}

char *my_strstr(const char *str1, const char *str2)
{
   char *p = (char*)str1; 
   assert(str1);
   assert(str2); 
   if(*str2 == '\0')
       return NULL;
   while(*p)
   { 
       char *q = (char*)str2;     //初始化q令q指向str2首地址
       char *s1 = p;              //初始化s1令s1指向p
    while(*p && *q && (*s1 == *q))
    {
        s1++;
        q++;
    } 
    if(*q =='\0')//判断是否结束的条件
        return p;
      p++;
   }
 return NULL;
}
char *my_strchr( char *dest, char c)
{
    while(*dest != '\0' && *dest != c)
    {
       dest++;
    }
    if(*dest == c)
        return dest;
    else
        return NULL;
}
int my_strcmp( const char *src,const char *dst)
{
     int ret = 0;
     assert(dst != NULL);
     assert(src != NULL);
     while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
       {  
           src++;
           dst++;
       }
         if(ret < 0)
            ret = -1;
         else if(ret > 0)
            ret = 1;
         return ret;

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

}
void *my_memmove(void *dst, const void *src, size_t count)
{
    void *ret = dst;
    assert(dst != NULL);
    assert(src != NULL);
    if(dst<src)
        while(count--){
           *(char*)dst = *(char*)src;
           dst = (char*)dst + 1;
           src = (char*)src + 1;
        }
    else

        while(count--){
           *((char*)dst + count)= *((char*)src + count);

        }
    return ret;
}
int main()
{
    char arr1[20] = "abcdefg";
    char arr2[] = "higklmn";
    char arr3[] = "cde";
    char arr4[] = "opqrstu";
    int arr5[7] = {1,2,3,4,5,6,7};
    int arr6[7] = {10,11,12,13,14,15,16};
    char a = 'b';
    int ret = 0;
    int i = 0;
    ret = my_strlen(arr1);
    printf("%d\n",ret);
    printf("%s\n",my_strchr(arr1,a));
    printf("%d\n",my_strcmp(arr1,arr2));
    printf("%s\n",my_strstr(arr1,arr3));
    printf("%s\n",my_strcpy(arr1,arr4));
    printf("%s\n",my_strcat(arr1,arr2));
    my_memcpy(arr5,arr6,16);
    for(i=0; i<7; i++)
    printf("%d ",arr5[i]);
    printf("\n");
    my_memmove(arr6+2,arr6,16);
    for(i=0; i<7; i++)
    printf("%d ",arr6[i]);
    printf("\n");
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/dream8834/article/details/80213101
今日推荐