六个字符串函数的实现

本文详细介绍了C语言中strlen、strcpy、strcat、strcmp、strstr和strtok六个字符串函数的实现原理和示例,通过自定义函数展示了如何计算字符串长度、拷贝、拼接、比较和查找操作。
摘要由CSDN通过智能技术生成

字符串函数定义了一系列可以直接调用的函数,这些函数可以方便的对字符串进行操作,常见的有strlen、strcpy、strcat、strcmp、strstr、strtok这六个,今天我们来通过函数自行实现。

strlen的实现

作用:求字符串的长度,知道碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包括'\0')

strlen原型:size_t strlen(const char* src)

#include <stdio.h>
#include <assert.h>
int my_strlen(const char* src)
{
    assert(src != NULL);
    int sum = 0;
    while (*src != '\0')
    {
        sum++;
        src++;
    }
    return sum;
}
int main()
{
    char* src = "HelloCake";
    printf("长度 = %d\n", my_strlen(src));
    return 0;
}

运行结果:"HelloCake"长度为9

strcpy的实现

作用:字符串拷贝,把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间

strlen原型:char* strcpy(char* dest, const char* src)

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
    assert((dest != NULL) && (src != NULL));
    char* ret = dest;
    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
        //循环中的内容可直接简写为 *dest++ = *src++;
    }
    *dest = '\0';
    return ret;
}
int main()
{
    char dest[20] = { 0 };
    char* src = "COPYCAKE";
    char *ret = my_strcpy(dest,src);
    printf("%s",ret);
    return 0;
    
}

运行结果:

把src中的"COPYCAKE"复制给了dest字符数组

strcat的实现

作用:字符串拼接,把src所指向的字符串(包括'\0')复制到dest所指向的字符串后面(删除*dest原来末尾的'\0')(在实现strcpy的基础上编写代码)

strcat原型:char* strcat(char* dest, const char* src)

实现代码:

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
    assert((dest != NULL) && (src != NULL));
    char* ret = dest;
    while (*dest != '\0')
    {
        dest++;
    }
    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
        //*dest++ = *src++;
    }
    *dest = '\0';
    return ret;
}
int main()
{
    char dest[20] = { "ABCD" };
    char* src = "efghi";
    my_strcat(dest, src);
    printf("%s", dest);
    return 0;

}

运行结果:

strcmp的实现

作用:字符串比较,用于比较字符串并根据结果返回整数,大于返回正数,小于返回负数,相等返回零

strstr原型:int strcmp(const char* s1, const char* s2)

实现代码:

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* s1, const char* s2)
{
    assert((s1 != NULL) && (s2 != NULL));
    while ((*s1 == *s2) && (*s1 != '\0'))
    {
        s1++;
        s2++;
    }
    if (*s1 > *s2)
    {
        return 1;
    }
    else if (*s1 < *s2)
    {
        return -1;
    }
    else
    {
        return 0;
    }
    //更简单的写法,可直接用return *s1 - *s2;通过返回的值的正负或者是否为0来判断

}
int main()
{
    char* s1 = "999";
    char* s2 = "996";
    int ret = my_strcmp(s1, s2);
    printf("%d", ret);
    return 0;
}

运行结果:返回1,s1 > s2

strstr的实现

作用:字符串查找,在字符串haystack中查找第一次出现字符串needle的位置,不包含'\0',找到则返回在haystack中第一次出现needle字符串的位置,没找到返回NULL

strstr原型:char* strstr(const char *hays,const char*needle)

实现代码:

#include <stdio.h>
#include <assert.h>
char* my_strstr(const char *hays,const char*needle)
{
    assert((hays != NULL) && (needle != NULL));
    while (*hays != '\0')
    {
        char* h = (char*)hays;//有const 先强转
        char* n = (char*)needle;//记录相等位置
        while (*h == *n)
        {
            h++;
            n++;
        }
        while (*n == '\0')//找完就输出
        {
            return (char*)hays;
        }
        hays++;//不等于/0 就++
    }
    return NULL;//最后没有就返回空
}
int main()
{
    char* dest = "ABCDEFG";
    char* src = "CDE";
    char *ret = my_strstr(dest, src);
    printf("%s", ret);
    return 0;
}

运行结果:

strtok的实现

作用:字符串截断,分解字符串str为一组字符串,delim为分隔符

strtok原型:char* strtok(char* str, const char* delim)

实现代码:

#include <stdio.h>
#include <assert.h>
int compare(char ch, const char* delim)
{
    while (*delim != '\0')
    {
        if (ch == *delim)
        {
            return 1;
        }
        delim++;
    }
    return 0;
}
char* my_strtok(char* str, const char* delim)
{
    assert(delim != NULL);
    static char* p = NULL; //保证不被释放
    
    if (str == NULL)
    {
        str = p;
    }
    if (*str == '\0')
    {
        return NULL;
    }
    char* ret = str;
    while (*str != '\0')
    {
        int temp  = compare(*str, delim);
        if (temp == 1)
        {
            p = str + 1;//跳过分割符继续
            *str = '\0';//逗号变成\0
            return ret;
        }
        str++;
    }
    p = str;
    return ret;
}
int main()
{
    char arr[] = "abc,123";
    char* ret = my_strtok(arr,",");
    printf("%s", ret);

}

运行结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值