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

注意:所有库函数头文件都是<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'也拷贝过去,*de

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值