服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

香港云服务器
服务器之家 - 编程语言 - C/C++ - 仿写C语言string.h头文件检验字符串函数

仿写C语言string.h头文件检验字符串函数

2022-02-22 14:49code-016 C/C++

这里给大家分享的是一个C语言string.h头文件检验字符串函数的仿写,非常的简单实用,小编觉得这篇文写的还不错,希望能够给你带来帮助

c语言string.h头文件字符串检验函数仿写

所需头文件:stdio.h ,stdlib.h, string.h

strlen字符串求长度

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int strlen_my(const char* src_str)
{
    if (NULL == src_str)
    {
        return -1;
    }
    const char* p = src_str;
    while (*p != '\0')
    {  
        p++;
    }
    return p - &(src_str[0]);
}
//递归
int strlen_my2(const char* src_str)
{
    if (src_str == NULL)
        return -1;
    if (*src_str)
    {
        return strlen_my2(src_str + 1) + 1;
    }
    else
    {
        return 0;
    }
}
 int main()
{
    const char* p = "hello";
    printf("%d \n",strlen_my(p));
    return 0;
}

strcmp / strncmp字符串比较

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int strcmp_my(const char* str_a, const char* str_b)
{
    while ((*str_a != '\0' || *str_b != '\0') && *str_a == *str_b )
    {
        str_a++;
        str_b++;
    }
    return *str_a - *str_b > 0 ? 1 : (*str_a - * str_b < 0 ? -1 : 0);
}
int strcmp_my2(const char* str_a, const char* str_b)
{
    int sub = 0;
    while ((sub = *str_a - *str_b) == 0 && *str_a++ && *str_b++);   //先赋值,指针再++
    return sub > 0 ? 1 : (sub < 0 ? -1 : 0);
}
 int strncmp_my(const char* str_a, const char* str_b, size_t front_len)
{
    while (--front_len && *str_a != '\0' && *str_b != '\0'
        && *str_a == *str_b)
    {
        str_a++;
        str_b++;
    }
    return *str_a - *str_b > 0 ? 1 : (*str_a - *str_b < 0 ? -1 : 0);
}
 int main()
{
    const char* p = "hella";
    const char* q = "hell";
    printf("%d \n", strncmp_my(p, q, 4));
    return 0;
}

strchr / strrchr 字符串中查找字符ch

第一个出现的字符ch

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//strchr 返回字符串中第一个出现的字符ch
char* strchr_my(const char* src_str, char ch)
{
    if (src_str == NULL)
    {
        return NULL;
    }
    while (*src_str != '\0' && *src_str != ch)
    {
        src_str++;
    }
    return *src_str == '\0' ? NULL : src_str;
}
 int main()
{
    const char* p = "hello";
    p = strchr_my(p, 'e');
    if (p == NULL)
        return 0;
    printf("%c\n", *p);
}

最后一个出现的字符ch

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//strrchr查找字符串中最后一个出现的字母ch
char* strrchr_my(const char* src_str, char ch)
{
    if (NULL == src_str) return NULL;
    const char* p = src_str + strlen(src_str) - 1;
    while ((p - src_str) >= 0 && *p != ch)
    {
        p--;
    }
    if (p - src_str == -1)
    {
        return NULL;
    }
    return p;
}
 int main()
{
    const char* p = "hello";
    //p = strchr_my(p, 'q');
    p = strrchr_my(p, 'l');
    if (p == NULL)
        return 0;
    printf("%c\n", *p);
}

strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,没有为NULL(BF算法)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
char* strstr_my(const char* src_str, const char* des_str)
{
    if (NULL == src_str || NULL == des_str)
    {
        return NULL;
    }
    int len_src = strlen(src_str);
    int len_des = strlen(des_str);
    int i = 0;  //src_str
    int j = 0;  //des_str
    while (i < len_src && j < len_des)
    {
        if (src_str[i] == des_str[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j == len_des)
    {
        return src_str + i - j;
    }
    return NULL;
}
 int main()
{
    const char* p = "hello";
    const char* q = "llo";
    const char* rt = strstr_my(p, q);
    if (rt != NULL)
    {
        printf("%s\n", rt);
        return 0;
    }
    return 0;
}

strcpy / strncpy字符串拷贝

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
char* strcpy_my(char* des_str, const char* src_str)
{
    if (des_str == NULL || src_str == NULL)
        return NULL;
    char* p = des_str;
    while (*src_str != '\0')
    {
        *p++ = *src_str++;
    }
    *p = '\0';
    return des_str;
}
 char* strncpy_my(char* des_str, const char* src_str, size_t len)
{
    if (des_str == NULL || src_str == NULL || len <= 0)
        return NULL;
    char* p = des_str;
    //源字符串实际长度
    int cur_len = strlen(src_str) <= len ? len : strlen(src_str);
    while (cur_len--)
    {
        *p++ = *src_str++;
    }
    *p = '\0';
    return des_str;
}
 int main()
{
    const char* p = "hello";
    char q[10] = {0};
    if (strncpy_my(q, p, 1) != NULL)
    {
        printf("%s\n", q);
    }
    return 0;
}

strcat / strncat字符串的粘贴

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
char* strcat_my(char* des_str, const char* src_str)
{
    if (des_str == NULL || src_str == NULL)
        return NULL;
    int len_des = strlen(des_str);
    char* p = des_str + len_des;
    while (*src_str != '\0')
    {
        *p++ = *src_str++;
    }
    return des_str;
}
 char* strncat_my(char* des_str, const char* src_str, size_t len)
{
    if (des_str == NULL || src_str == NULL || len < 0)
        return NULL;
    int len_des = strlen(des_str);
    char* p = des_str + len_des;
 
    while (len--)
    {
        *p++ = *src_str++;
    }
    return des_str;
}
 int main()
{
    char p[20] = "hello";
    const char* q = "world";
    printf("p = %s\n", p);
    printf("q = %s\n", q);
    if (strncat_my(p, q, 3) != NULL)
    {
        printf("p = %s\n", p);
    }
    printf("q = %s\n", q);
    return 0;
}

strdup 字符串申请堆区空间存放字符串的副本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
char* strdup_my(const char* src_str)
{
    if (NULL == src_str)
        return NULL;
    char* newspace = (char*)malloc((strlen(src_str) + 1 ) * sizeof(char));
    if (newspace == NULL)
        return NULL;
    int i = 0;
    while (*src_str != '\0')
    {
        newspace[i++] = *src_str++;
    }
    newspace[i] = '\0';
    return newspace;
}
int main()
{
    const char* p = "hello";
    char* q = strdup_my(p);
    if (q != NULL)
    {
        printf("%s\n", q);
        free(q);
        q == NULL;
    }
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/xiaoxiaoguailou/article/details/121267391

延伸 · 阅读

精彩推荐
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07
384