C语言模拟实现库函数strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、memcpy、memmove、memcmp

本文详细介绍了如何使用C语言模拟实现strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、memcpy、memmove和memcmp等字符串和内存操作函数。通过不同的实现方法,如计数法、递归法和指针操作,阐述了这些函数的基本原理和应用。每个函数都包括描述、声明、参数和返回值,并提供了完整的模拟实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:所有库函数头文件都是<string.h>


1.strlen介绍:

描述

C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符,这里注意一点,再用sizeof求内存大小时会计算到'\0'

声明。

下面是 strlen() 函数的声明。

参数

  • str -- 要计算长度的字符串。

返回值

该函数返回字符串的长度。

模拟实现:

实现1:

计算器方法:

#include <stdio.h>
#include <assert.h>
int is_prime_values_my_strlen(char* str)
{
    //断言
    assert(str);
    int count = 0;
    while (*str != '\0')
    {
        str++;
        count++;
    }
    return count;
}
int main()
{
    char values[30] = { 0 };
    scanf("%s", values);
    int ret = is_prime_values_my_strlen(values);
    printf("ret=%d\n", ret);
    return 0;
}

这是用计数器的方法写,str不等于'\0'就一直加加,直到str等于'\0'时,coun里面放的就是字符串的长度

strlen求字符串长度时,是不会计算到字符'\0'的,只计算到'\0'前面的一个字符

这里多补充一点,在用sizeof求内存大小时,会把字符'\0'也计算进去

实现2:

递归求法:

#include <assert.h>
#include <stdio.h>
size_t is_prime_values_my_strlen(char* str)
{
    assert(str);
    if (*str == '\0')
        return 0;
    else
        return 1 + is_prime_values_my_strlen(str + 1);
}
int main()
{
    char values[] = "abcdef";
    int ret=is_prime_values_my_strlen(values);
    printf("ret=%d\n", ret);
}

实现3:

指针减指针写法:

#include <assert.h>
#include <stdio.h>
size_t is_prime_values_my_strlen(char* str)
{
    assert(str);
    char* ret = str;
    char* len = str;
    while (*len != '\0')
    {
        len++;
    }
    return len - ret;
}
int main()
{
    char values[] = "abcdef";
    int ret=is_prime_values_my_strlen(values);
    printf("ret=%d\n", ret);
}

在数组里,用最高处地址的指针减去最低地址的指针,也就是指针减指针得到的就是中间元素的个数所以这里先定义ret和len最开始赋值为str,也就是首字符a的位置,在写while循环,如果len不等于'\0'就一直++,知道len等于'\0',这时len里面就放了f的地址,在return返回f减a得到字符串大小

2.strcpy介绍:

描述

C 库函数 char *strcpy(char *dest, const char *src)src 所指向的字符串复制到 dest

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。

声明

下面是 strcpy() 函数的声明。

参数

  • dest -- 指向用于存储复制内容的目标数组。
  • src -- 要复制的字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

实现:

#include <assert.h>
#include <stdio.h>
char* is_prime_values_my_strcpy(char* dest, const char* src)
{
    //断言,意思是desr和src不能为空指针
    assert(dest != NULL && src != NULL);
    char* ret = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char values1[] = "abcdef";
    char values2[] = "ghi";
    char* ret = is_prime_values_my_strcpy(values1, values2);
    printf("ret=%s\n", ret);
    return 0;
}

strcpy在拷贝时会把'\0'也拷贝过去,*dest++=*src++的意思是,因为++是后置++,先进行运算在++所以在dest赋给src时,拷贝了一个字符,就在++进行下一个字符的拷贝.直到src最后的字符'\0'给拷贝给dest是表达式为假,就不再进行拷贝了

因为返回值是一个指向最终的目标字符串 dest 的指针,所以在dest刚进来时,就用ret存放dest的值,

最后返回ret

3.strcat介绍:

描述

C 库函数 char *strcat(char *dest, const char *src)src 所指向的

好的,我很乐意为您介绍C语言strcpystrcatstrcmpstrstr这几个标准库函数实现方式。这些函数都是操作字符串的常用函数,下面我将逐一为您解释它们的实现原理: 1. strcpy(字符串复制): ```c char *strcpy(char *dest, const char *src) { char *ret = dest; while ((*dest++ = *src++) != '\0'); return ret; } ``` 这个函数逐个字符复制src指向的字符串到dest指向的内存位置,直到遇到字符串结束符'\0'。 2. strcat(字符串连接): ```c char *strcat(char *dest, const char *src) { char *ret = dest; while (*dest != '\0') dest++; while ((*dest++ = *src++) != '\0'); return ret; } ``` 这个函数首先将dest指针移动到字符串末尾,然后将src指向的字符串逐个字符复制到dest的末尾。 3. strcmp(字符串比较): ```c int strcmp(const char *s1, const char *s2) { while (*s1 && (*s1 == *s2)) { s1++; s2++; } return *(unsigned char *)s1 - *(unsigned char *)s2; } ``` 这个函数逐个字符比较两个字符串,直到遇到不同的字符或者字符串结束符。返回值表示两个字符串的关系。 4. strstr(子字符串查找): ```c char *strstr(const char *haystack, const char *needle) { if (!*needle) return (char *)haystack; for (; *haystack; ++haystack) { if (*haystack == *needle && strncmp(haystack, needle, strlen(needle)) == 0) return (char *)haystack; } return NULL; } ``` 这个函数在主字符串(haystack)中查找子字符串(needle)第一次出现的位置。它使用strncmp函数来比较子字符串。 这些实现方式都是标准库函数的基本实现原理。在实际使用中,建议使用标准库提供的函数,因为它们通常经过优化,并且考虑了各种边界情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值