模拟实现str类函数和几个内存操作函数

模拟实现strcpy函数:将一个字符串拷贝到另一个字符串里

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char *my_strcpy(char *dest,const char *str)
{
    char *ret = dest;
    while (*dest++ = *str++)
    {
        ;
    }
    return ret;
}
int main()
{
    char *arr1 = "hello,zhaoman!";
    char arr2[20];
    char *ret = my_strcpy(arr2, arr1);
    printf("%s", ret);
    system("pause");
    return 0;
}

模拟实现strcmp函数:两个字符串的比较

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

int my_strcmp(const char *str1, const char *str2)
{
    assert(str1);
    assert(str2);

    int num1 = strlen(str1);
    int num2 = strlen(str2);

    if (num1 > num2)
    {
        return 1;
    }
    else if (num1 < num2)
    {
        return - 1;
    }
    else
    {
        while (*str1)
        {
            if (*str1>*str2)
            {
                return 1;
            }
            else if (*str1 < *str2)
            {
                return -1;
            }
            else
            {
                str1++;
                str2++;
            }
        }
    }
}
int main()
{
    char str1[] = "gsdhy";
    char str2[] = "ahaom";
    int ret = my_strcmp(str1, str2);
    if (ret > 0)
    {
        printf("str1>str2");
    }
    else if (ret == 0)
    {
        printf("str1=str2");
    }
    else
    {
        printf("str1<str2");
    }
    system("pause");
    return 0;
}

模拟实现strcat函数:字符串拼接函数将一个字符串拼接到另一个字符串上

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char *my_strcat(char *dest, const char *str)
{
    assert(dest);
    assert(str);
    char *ret = dest;
    while (*dest)
    {
        dest++;
    }
    while (*dest++ = *str++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[] = "hello ";
    char arr2[] = "zhaoman";
    char *ret = my_strcat(arr1, arr2);
    printf("%s", ret);
    system("pause");
    return 0;
}

模拟实现strstr函数:判断一个字符串是不是另一个字符串的子串

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char *my_strstr(const char *dest, const char *src)
{
    assert(dest);
    assert(src);

    const char *str1 = dest;
    const char *str2 = src;
    const char *start = NULL; 


    if (*str2 == '\0')//空串是任何字符串的子串
    {
        return str1;
    }
    while (*str1)
    {
        start = str1;
        while ((*str1)&&(*str2)&&(*str1==*str2))
        {
            str1++;
            str2++;
        }
        if (*str2 == '\0')
        {
            return start;
        }
    }
    str1 = start + 1;
    str2 = dest;
}
int main()
{
    char *arr1 = "zhao";
    char *arr2 = "zhaoman";
    char *ret = my_strstr(arr2, arr1);
    printf("%s", ret);
    system("pause");
    return 0;
}

strchr:找到一个字符第一次出现的位置并返回这个下标

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char *my_strchr(const char *str, int a)
{
    assert(str);
    assert(a);

    char *ret = str;
    while (*ret++)
    {
        if (*ret == a)
        {
            return ret;
        }
    }
    return NULL;
}
int main()
{
    char str[] = "hello zhaoman!";
    char a = 'a';
    char *ret = my_strchr(str, a);
    int num = ret - str + 1;
    if (ret == NULL)
    {
        printf("没找到!");
    }
    else
    {
        printf("%d", num);
    }
    system("pause");
    return 0;
}

memcpy:从头开始拷贝一个字符串到另一个字符串

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void *my_memcpy(void *dest, const void *src, size_t count)
{
    assert(src);
    assert(count);

    void *ret = dest;
    char *str1 = (char*)dest;
    char *str2 = (const char*)src;

    while (count--)
    {
        *str1++ = *str2++;
    }
    return ret;
}
int main()
{
    char str1[]= "zhaoman";
    char str2[]="zhmm";
    char *p = my_memcpy(str1, str2, 4);
    printf("%s", str1);
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值