【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

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

相关文章
|
4月前
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
43 3
|
4月前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
|
3月前
|
安全 编译器 C语言
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
31 1
|
4月前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
4月前
|
C语言
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现2
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现
|
4月前
|
存储 C语言
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现1
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现
strcpy与strncpy的模拟与实现
strcpy与strncpy的模拟与实现
38 0
|
C语言
自己实现strcpy和strlen函数
自己实现strcpy和strlen函数
76 0
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
40 0
|
编译器 C语言
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
122 0