【C】字符串库函数及模拟实现(上)—— strlen | strcpy | strcat | strcmp

简介: strlen | strcpy | strcat | strcmp

@TOC
反爬链接

:purple_heart:在本专题内 将重点介绍:

:star: 字符函数
:star: 字符串函数
:star: 内存函数
这些库函数的使用和注意事项。

这些注意事项有些看似是很不起眼,但是我们必须充分了解以便自己能模拟实现。
所以在看注意事项时,一是要在未来使用时多注意,二是要思考对应需求如何用代码实现。

有:
:apple:求字符串长度的函数

1.strlen

:apple:长度不受限制的字符串函数

1.strcpy
2.strcat
3.strcmp

:apple:长度受限制的的字符串函数

1.strncpy
2.strncat
3.strncmp

引:

C语言中对字符和字符串的处理很是频繁,但是C语言本身没有字符串类型,字符串通常放在 常量字符串字符数组中。

正文开始@边通书

学习这块内容,要勤查阅此网站:
点击直达http://www.cplusplus.com/

1.strlen

在这里插入图片描述
下面将围绕这几点详细展开:

:grapes:strlen函数用来计算字符串长度,返回的是 \0之前出现字符个数
:grapes:参数指向字符串必须以 \0结束
:grapes:函数的返回值类型为 size_t,即 无符号整型(易错)
:innocent:学会strlen的模拟实现(三种方法:1.计数器 2.指针-指针 3.递归 --- 不创建任何临时变量实现求字符串长度

:grapes:strlen函数返回的是无符号整型:
在这里插入图片描述
典例:
问输出结果?

#include <stdio.h>
#include <sting.h>

int main()
{
    const char*str1 = "abcdef";
    const char*str2 = "bbb";
    if (strlen(str2) - strlen(str1)>0)
    {
        printf("hehe\n");
    }
    else
    {
        printf("haha\n");
    }
    return 0;
}

在这里插入图片描述
:grapes:参数指向字符串必须以\0结束
在这里插入图片描述

:innocent: strlen的模拟实现--- my_strlen(三种方式)

:fish: 计数器
在这里插入图片描述
:fish: 指针 - 指针
在这里插入图片描述
:fish: 递归(不创建临时变量)
在这里插入图片描述
代码如下:

#include <stdio.h>

size_t my_strlen(char* ptr)
{
    if ((*ptr) != '\0')
    {
        return 1 + my_strlen(ptr+1);
    }
    else
    {
        return 0;
    }
}

int main()
{
    char arr[] = "beatles";
    size_t len = my_strlen(arr);
    printf("%u\n", len);
    return 0;
}

画图分析递归调用过程:
在这里插入图片描述

2.strcpy

在这里插入图片描述

:grapes:源字符串必须以 \0结束
:grapes:会将源字符串的 \0拷贝到目标空间
:grapes:目标空间必须足够的大,能容下源字符串内容
:grapes:目标空间可修改
:innocent:学会strlen的模拟实现

:grapes:源字符串必须以\0结束
在这里插入图片描述

:grapes:会将源字符串的\0拷贝到目标空间
在这里插入图片描述
:grapes:目标空间必须足够大
在这里插入图片描述
:grapes:目标空间可修改
在这里插入图片描述

:innocent: strcpy函数的模拟实现

完美代码:

#include<stdio.h>
#include<assert.h>

char* my_strcpy(char* dest, const char* src)
{
    assert(dest&&src);//断言-release版本可以优化掉
    char* ret = dest;
    //1.拷贝字符串
    //2.遇到\0为止
    while (*dest++ = *src++ )
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "abc";
    char arr2[] = "def";
    printf("%s\n", my_strcpy(arr1, arr2));
    return 0;
}

剖析:
在这里插入图片描述

3.strcat

字符串连接/追加。
在这里插入图片描述
在这里插入图片描述

:grapes:源字符串必须以 \0结束
:grapes:目标空间足够大,能容纳下源字符串内容
:grapes:目标空间可修改
:grapes:自己给自己追加要用 strncat
:innocent: strcat的模拟实现

:grapes:源字符串必须以\0结束
在这里插入图片描述

:grapes:目标空间足够大,能容纳下源字符串内容
在这里插入图片描述

:innocent: strcat的模拟实现--- my_strcat
#include<stdio.h>
#include<assert.h>

char* strcat(char* dest, const char* src)
{
    assert(dest&&src);//断言
    char* ret = dest;
    //1.找到目标字符串末尾'\0'
    while (*dest != '\0')
    {
        dest++;
    }
    //2.追加字符串直到'\0'-与strcpy非常相似
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "abc";
    char arr2[] = "def";
    printf("%s\n", strcat(arr1, arr2));
    return 0;
}

4.strcmp

在这里插入图片描述
在这里插入图片描述
:innocent:strcmp的模拟实现my_strcmp

#include<stdio.h>
#include<assert.h>

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1&&str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
            return 0;
        str1++;
        str2++;
    }
    return *str1 - *str2;
}

int main()
{
    char arr1[] = "abcd";
    char arr2[] = "abc";
    int ret = my_strcmp(arr1, arr2);
    printf("%d\n", ret);
    if (ret == 0)
    {
        printf("==\n");
    }
    else if (ret > 0)
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
}

在这里插入图片描述
剖析:
在这里插入图片描述
那么,以上strcpy,strcat,srtcmp是没有长度限制的字符串函数,这些函数是相对不安全的。
下篇文章将介绍相对安全的,有长度限制的字符串函数strcpy,strcat,strcmp

有木有发现文章里出现的都是应季水果,我天天都在吃哈哈哈哈哈

相关文章
|
存储 Java 测试技术
《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解
Spring 提供了一组测试工具,可以轻松地测试 Spring 应用程序的各个组件,包括控制器、服务、存储库和其他组件。它具有丰富的测试注释、实用程序类和其他功能,以帮助进行单元测试、集成测试等。
220 0
|
SQL 分布式计算 资源调度
阿里云MaxCompute-Hive作业迁移语法兼容性踩坑记录
阿里云MaxCompute-Hive作业迁移语法兼容性踩坑记录
1693 0
|
数据可视化 数据挖掘 Python
数据分析案例-往届世界杯数据可视化
数据分析案例-往届世界杯数据可视化
849 0
数据分析案例-往届世界杯数据可视化
|
存储 NoSQL 索引
MongoDB聚合—计数count
MongoDB聚合—计数count
8415 0
|
存储 JSON 安全
Hologres的查询能力
Hologres的查询能力【8月更文挑战第25天】
159 0
|
存储 Linux 数据库
k8s-dashboard、helm
k8s-dashboard、helm
537 1
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
293 1
|
监控 Oracle 关系型数据库
关系型数据库Oracle恢复测试
【7月更文挑战第20天】
270 7
|
监控 NoSQL Redis
Redis性能优化问题之lazyfree_pending_objects 这个指标有什么作用
Redis性能优化问题之lazyfree_pending_objects 这个指标有什么作用