strlen,strcpy,strcmp,strcat,strstr的模拟实现

直接以代码的形式进行呈现了。 

1.strlen

#include<stdio.h>
size_t my_strlen(const char* str)
{
    const char* s;
    for (s = str; *s; ++s) {}
    return (size_t)(s - str);
}

int main()
{
    char str[] = "Hello, world!";
    size_t len = my_strlen(str);
    printf("Length of '%s' is %zu.\n", str, len);

    return 0;
}

2.strcpy


#include<stdio.h>
char* my_strcpy(char* p1, char* p2)
{
    char* ret = p1;
    assert(p1 && p2);
    while (*p1++ = *p2++)
    {
        ;
    }
    return ret;
}
int main()
{
    char str0[20] = { 0 };
    my_strcpy(str0, str);
    printf(" %s\n", str0);
    return 0;
}

3.strcmp

#include <stdio.h>

// 模拟实现 strcmp 函数
int my_strcmp(const char *s1, const char *s2) {
    while (*s1 && (*s1 == *s2)) {
        s1++;
        s2++;
    }
    return *(const unsigned char *)s1 - *(const unsigned char *)s2;
}

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    char str3[] = "Hello";

    // 比较 str1 和 str2
    int result = my_strcmp(str1, str2);
    if (result < 0) {
        printf("'%s' is less than '%s'\n", str1, str2);
    } else if (result > 0) {
        printf("'%s' is greater than '%s'\n", str1, str2);
    } else {
        printf("'%s' is equal to '%s'\n", str1, str2);
    }

    // 比较 str1 和 str3
    result = my_strcmp(str1, str3);
    if (result < 0) {
        printf("'%s' is less than '%s'\n", str1, str3);
    } else if (result > 0) {
        printf("'%s' is greater than '%s'\n", str1, str3);
    } else {
        printf("'%s' is equal to '%s'\n", str1, str3);
    }

    return 0;
}

4.strcat

#include <stdio.h>

// 模拟实现 strcat 函数
char *my_strcat(char *dest, const char *src) {
    char *ret = dest;

    // 移动指针到 dest 的末尾
    while (*dest) {
        dest++;
    }

    // 从 src 的第一个字符开始复制,直到包括 '\0'
    while ((*dest++ = *src++));

    return ret; // 返回 dest 的原始值
}

int main() {
    char dest[50] = "Hello, ";
    char src[] = "world!";

    my_strcat(dest, src);
    printf("After strcat: '%s'\n", dest);

    return 0;
}

5.strstr

char* my_strstr(const char* haystack, const char* needle) {
    // 如果needle为空字符串,则返回haystack的起始地址
    if (*needle == '\0') {
        return (char*)haystack;
    }

    // 遍历haystack
    for (const char* h = haystack; *h != '\0'; h++) {
        // 如果当前字符与needle的第一个字符匹配,开始进一步检查
        if (*h == *needle) {
            const char* n = needle;
            const char* h2 = h;

            // 继续比较后续字符
            while (*n != '\0' && *h2 == *n) {
                h2++;
                n++;
            }

            // 如果完成了needle的遍历,则找到了匹配,返回当前位置
            if (*n == '\0') {
                return (char*)h;
            }
        }
    }

    // 如果没有找到匹配,返回NULL
    return NULL;
}
int main() {
    const char* haystack = "Hello, World!";
    const char* needle = "World";

    char* result = my_strstr(haystack, needle);
    if (result) {
        printf("Found: %s\n", result);
    }
    else {
        printf("Not found.\n");
    }

    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值