模拟库中的字符串处理函数

1.模拟实现strcpy函数的功能

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char *my_strcpy(char *dst,char const *src)
{
    char *ret = dst;
    assert(dst);
    assert(src);
    while (*dst++ = *src++);
    return ret;

}
int main()
{
    char *msg = "hello world";
    char str[20] = {0};
    printf("%s \n",my_strcpy(str,msg));
    system("pause");
    return 0;
}

2.实现strncpy函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char *my_strncpy(char *dst,char const *src,int n)
{
    char *ret = dst;
    assert(dst);
    assert(src);
    //如果拷贝的字符串长度小于源字符串的长度,则将会输出一个不合法的字符串,可能会输出乱码
    while (n-- && *src != '\0' )
    {
        *dst++ = *src++;
    }
    //如果拷贝的长度小于源字符串的长度
    if (n != 0)
    {
        while (n--)
        {
            *dst = '\0';//应该将dst剩余的空间内容置为'\0'
        }
    }
    return ret;
}

int main()
{
    char *msg = "hello world";
    char str[20] ;
    int num = 0;
    printf("Please Enter your number of copy:>");
    scanf("%d",&num);
    printf("%s \n",my_strncpy(str,msg,num));
    system("pause");
    return 0;
}

当拷贝的字符串长度小于源字符串的长度时,输出结果如下:

这里写图片描述

3.实现strcat函数的功能:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

char *my_strcat(char *dst,char const *src)
{
    char *dst_end = dst + strlen(dst) ;
    char *ret = dst_end;
    assert(dst);
    assert(src);
    while (*dst_end++ = *src++);
    return dst;
}

int main()
{
    char dst[40] = "I love ";
    char *src = " my nation";
    printf("%s\n",my_strcat(dst,src));
    system("pause");
    return 0;
}

4.实现strncat函数的功能

#pragma warning(disable : 4996)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

char *my_strncat(char *dst,const char *src,int n)
{
    assert(dst);
    assert(src);
    char *dst_end = dst + strlen(dst);
    while ((*src != '\0') && (n--))
    {
        *dst_end++ = *src++; 
    }
    *dst_end = '\0';
    return dst;
}

int main()
{
    char *src = "world";
    char dst[32] = "hello";
    my_strncat(dst,src,29);
    printf("%s \n",dst);
    system("pause");
    return 0;
}

5.实现strcmp函数

第一种方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

int my_strcmp(char const *str1,char const *str2)
{
    assert(str1);
    assert(str2);
    while (*str1 != '\0' && *str2 != '\0')//判断字符串中对应字符的大小
    {
        if(*str1 > *str2)
        {
            return 1;//str1大于str2中的字符,返回1
        }
        else if(*str1 < *str2)
        {
            return -1;//str1小于str2中的字符,返回-1
        }
        else
        {
            str1++,str2++;//对应的字符相等,则比较下一个字符
        }
    }
    if (*str1 == '\0' && *str2 != '\0')
    {
        return -1;
    }
    else if(*str1 != '\0' && *str2 == '\0')
    {
        return 1;
    }
    else
        return 0;
}

int main()
{
    char *str1 = "hello world";
    char *str2 = "hello world";
    printf("%d\n",my_strcmp(str1,str2));
    system("pause");
    return 0;
}

第二种方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

int my_strcmp(const char *str1,const char *str2)
{
    assert(str1);
    assert(str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
        {
            return 0;
        }
    }
    return *str1 - *str2;
}


int main()
{
    const char *str1 = "bcdefg";
    const char *str2 = "abcdefg";
    int ret = my_strcmp(str1,str2);
    if (ret > 0)
    {
        printf("str1 > str2\n");
    }
    else if(ret < 0)
    {
        printf("str1 < str2\n");
    }
    else
    {
        printf("str1 = str2\n");
    }
    system("pause");
    return 0;
}

这里写图片描述

6.实现strncmp函数


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

int my_strncmp(const char *str1,const char *str2,int n)
{
    assert(str1);
    assert(str2);
    while (n-- && (*str1 == *str2))
    {
        if (*str1 == '\0')
        {
            return 0;
        }
        str1++,str2++;
    }
    return *str1 - *str2;
}


int main()
{
    char *str1 = "abs";
    char *str2 = "absb";
    int ret = my_strncmp(str1,str2,5);
    printf("%d \n",ret);
    system("pause");
    return 0;
}

这里写图片描述

7.实现memcpy函数的实现
(标准规定:两块空间之间没有关联,简单的说,就是两块空间没有重叠)

第一种方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

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

}

int main()
{
    char dest[40] = "this is a game";
    char *src = "hello";

    char *ret = (char *)my_memcpy(dest,src,sizeof(char) * strlen (src));
    printf("%s\n",ret);
    system("pause");
    return 0;
}

第二种方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

void show(int *arr,int sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}

void *my_memcpy(void *dst,void *src,int sz)
{
    char *pdst = (char *)dst;
    char *psrc = (char *)src;
    assert(dst);
    assert(src);
    assert(sz > 0);
    while (sz--)
    {
        *pdst++ = *psrc++;
    }
    return dst;
}


int main()
{
    int arr1[] = {1,2,3,4,5,6,7,8,9,0};
    int arr2[10];
    int sz = sizeof(arr1);
    my_memcpy(arr2,arr1,sz);
    show(arr2,sz/sizeof(int));
    system("pause");
    return 0;
}

结果如下:
这里写图片描述

8.实现memmove函数的功能:
(这个函数与memcpy函数最大的不同是它考虑了拷贝的两块空间重叠的情况)

分析图示:

这里写图片描述

第一种方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

void *my_memmove(void *dst,void *src,int count)
{
    char *_dst = (char *)dst;
    char *ret = _dst;
    char *_src = (char *)src;
    char *_dst_end = _dst + count - 1;
    char *_src_end = _src + count - 1;
    assert(dst);
    assert(src);
    while (count--)
    {
        if (_src < _dst && _dst < _src_end + 1)//切记:_dst < _src_end + 1(需要减至'\0'的后面)
        {
            *_dst_end-- = *_src_end--;
        }
        else
        {
            *_dst++ = *_src++;
        }
    }
    return ret;
}


int main()
{
    char dst[34] = "hello";
    int count  = strlen(dst) + 1;
    my_memmove(dst+1,dst,count);
    printf("%s \n",dst);
    system("pause");
    return 0;
}

这里写图片描述

第二种方法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

void show(int *arr,int sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}

void *my_memmove(void *dst,void *src,int count)
{
    char *pdst = (char *)dst;
    char *psrc = (char *)src;
    assert(dst);
    assert(src);
    assert(count > 0);
    if (pdst > psrc && pdst < psrc + count)
    {
        while (count--)
        {
           *(pdst + count) = *(psrc + count);//注意:count一直在减1
        }
    }
    else
    {
        while (count--)
        {
            *pdst++ = *psrc++;
        }
    }
    return dst;
}


int main()
{
    int arr1[10] = {1,2,3,4,5,6,7,8,9};
    int sz = sizeof(arr1);
    my_memmove(arr1+1,arr1,sz);
    show(arr1,sz/sizeof(int));
    system("pause");
    return 0;
}

这里写图片描述

9.模拟实现memset函数:

调用memset函数后的结果:

这里写图片描述

模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

void show(int *arr,int sz)
{
    int i = 0;
    assert(arr);
    for (i = 0; i < sz; i++)
    {
        printf("%x ",arr[i]);
    }
    printf("\n");
}

void *my_memset(void *dst,int c,int count)
{
    assert(dst);
    assert(count > 0);
    while (count--)
    {
        *(char *)dst = 1;
        dst = (char *)dst + 1;
    }
}


int main()
{
    int arr[10];
    show(arr,sizeof(arr)/sizeof(int));
    my_memset(arr,1,sizeof(arr));
    show(arr,sizeof(arr)/sizeof(int));
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值