[C语言] string.h相关函数自实现

本文详细介绍了C语言中的字符串处理函数,包括strlen计算字符串长度,strcpy和strncpy进行字符串复制,strcat和strncat连接字符串,strcmp比较字符串,以及chr系列函数查找字符和strstr查找子串。还涉及到了atoi将字符串转换为整型。
摘要由CSDN通过智能技术生成

strlen

/**
 * 计算字符串s的长度
 * @param s 字符串
 * @return 字符串长度
 */
size_t my_strlen(const char *s)
{
    // 遍历字符串s,直到遇到'\0'
    const char *p = s;
    while (*p != '\0')
    {
        // 指针后移
        ++p;
    }
    // 返回字符串长度
    return p - s;
}

strcpy 与 strncpy

/**
 * 将字符串src复制到dest
 * @param dest 目标字符串
 * @param src 源字符串
 * @return 复制后的字符串
 */
char *my_strcpy(char *dest, const char *src)
{
    size_t i;
    // 遍历src字符串,直到遇到'\0'
    for (i = 0; src[i] != '\0'; ++i)
    {
        // 将src字符串中的字符复制到dest字符串中
        dest[i] = src[i];
    }
    // 将dest字符串的最后一个字符设置为'\0'
    dest[i] = '\0';
    // 返回复制后的字符串
    return dest;
}

/**
 * 将字符串src中的前n个字符复制到dest
 * @param dest 目标字符串
 * @param src 源字符串
 * @param n 复制字符的数量
 * @return 复制后的字符串
 */
char *my_strncpy(char *dest, const char *src, size_t n)
{
    size_t i;
    // 将src字符串的前n个字符复制到dest字符串中
    for (i = 0; i < n && src[i] != '\0'; ++i)
    {
        dest[i] = src[i];
    }

    // 如果src字符串的字符数量小于n,将dest字符串的剩余字符设置为\0
    while (i < n)
    {
        dest[i] = '\0';
        ++i;
    }
    return dest;
}

strcat 与 strncat

/**
 * 连接两个字符串
 * @param dest 目标字符串
 * @param src 源字符串
 * @return 连接后的字符串
 */
char *my_strcat(char *dest, const char *src)
{
    // 获取目标字符串的长度
    size_t dest_len = strlen(dest);
    // 定义一个变量i,用于循环
    size_t i;
    // 循环遍历源字符串,将源字符串中的字符添加到目标字符串的末尾
    for (i = 0; src[i] != '\0'; ++i)
    {
        dest[dest_len + i] = src[i];
    }
    // 在连接字符串后添加一个结束符
    dest[dest_len + i] = '\0';
    // 返回连接后的字符串
    return dest;
}

/**
 * 将字符串src中的前n个字符连接到dest字符串的末尾
 * @param dest 目标字符串
 * @param src 源字符串
 * @param n 需要连接的字符数量
 * @return 连接后的字符串
 */
char *my_strncat(char *dest, const char *src, size_t n)
{
    size_t dest_len = strlen(dest);
    size_t i;
    // 将src字符串的前n个字符连接到dest字符串的末尾
    for (i = 0; i < n && src[i] != '\0'; ++i)
    {
        dest[dest_len + i] = src[i];
    }
    // 添加字符串结束符
    dest[dest_len + i] = '\0';
    return dest;
}

strcmp

/**
 * 比较两个字符串s1和s2,并返回比较结果
 * @param s1 字符串s1
 * @param s2 字符串s2
 * @return 比较结果
 */
int my_strcmp(const char *s1, const char *s2)
{
    // 遍历两个字符串,直到遇到不同的字符或者遇到字符串结束符'\0'
    while (*s1 == *s2 && *s1 != '\0')
    {
        s1++;
        s2++;
    }
    // 计算两个字符的ASCII码之差
    int i = *s1 - *s2;
    // 如果两个字符相等,返回0
    if (i == 0)
    {
        return i;
    }
    // 如果s1中的字符大于s2中的字符,返回1;否则返回-1
    return *s1 - *s2 > 0 ? 1 : -1;
}

strchr 与 strrchr

/**
 * 在字符串s中查找第一个字符c的位置,并返回指向该字符的指针
 * @param s 字符串s
 * @param c 字符c
 * @return 指向字符c的指针,如果没有找到则返回NULL
 */
char *my_strchr(const char *s, int c)
{
    // 遍历字符串s
    while (*s != '\0')
    {
        // 如果找到字符c
        if (*s == c)
        {
            // 返回指向字符c的指针
            return (char *) s;
        }
        // 指针后移
        ++s;
    }
    // 如果没有找到字符c,返回NULL
    return (char *) NULL;
}

/**
 * 在字符串s中查找最后一个字符c的位置,并返回指向该字符的指针
 * @param s 字符串s
 * @param c 字符c
 * @return 指向字符c的指针,如果没有找到则返回NULL
 */
char *my_strrchr(const char *s, int c)
{
    // 设置最后一个匹配的位置为NULL
    char *last_match = NULL;
    // 遍历字符串s
    while (*s != '\0')
    {
        // 如果找到字符c
        if (*s == c)
        {
            // 记录匹配到的指针位置
            last_match = (char *) s;
        }
        ++s;
    }
    // 返回最后一次匹配的位置
    return last_match;
}

strstr

/**
 * 在字符串s中查找子字符串t,并返回指向该子字符串的指针
 * @param haystack 字符串s
 * @param needle 子字符串t
 * @return 指向子字符串t的指针
 */
char *my_strstr(const char *haystack, const char *needle)
{
    // 如果needle字符串为空,则返回haystack字符串
    if (*needle == '\0')
    {
        return (char *) haystack;
    }
    // 遍历haystack字符串
    while (*haystack != '\0')
    {
        // 遍历haystack和needle字符串,比较对应字符是否相等
        const char *h = haystack;
        const char *n = needle;
        while (*h == *n && *h != '\0')
        {
            ++h;
            ++n;
        }
        // 如果needle字符串已经遍历完,则返回haystack字符串
        if (*n == '\0')
        {
            return (char *) haystack;
        }

        // 遍历haystack字符串
        ++haystack;
    }
    // 如果没有找到子字符串,则返回NULL
    return NULL;
}

atoi

/**
 * 字符串nptr转整型
 * @param nptr 字符串
 * @return 字符串的整型
 */
int my_atoi(const char *nptr)
{
    // 初始化累加和为0
    int sum = 0;
    // 当指针指向的值不为空时,继续循环
    while (*nptr != '\0')
    {
        // 如果指针指向的值在0~9之间,则累加,并且指针后移
        if (*nptr >= '0' && *nptr <= '9')
        {
            sum = 10 * sum + (*nptr - '0');
            ++nptr;
        }
            // 否则跳出循环
        else
        {
            break;
        }
    }
    // 返回累加和
    return sum;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值