• 求字符串函数和长度不受限制的字符串函数的详解


    前言

    作者:小蜗牛向前冲

    名言:我可以接收失败,但我不能接收放弃

     如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

     这期博客主要为大家介绍一些字符串函数实现及注意点。

     求字符串长度

    strlen函数

    定义

     传参

     传字符串过去或者字符串的首地址。

    该函数是用来求字符串长度,遇到'\0'就停止计算,返回类型是size_t(unsigned int ),

    头文件是<string.h>,下面我们继续介绍是如何使用。

    strlen使用举例:

    1. #include<stdio.h>
    2. #include<string.h>
    3. int main()
    4. {
    5. char arr []= "abcdef";
    6. int ret = strlen(arr);
    7. printf("ret = %d\n", ret);
    8. return 0;
    9. }

    这里直接传字符串也是可以的。

     我们知道了strlen函数的使用,为了让我们更好的理解strlen函数。下面我将用三种方式去模拟实现strlen函数。

    1 计数器的方式

    1. //计数器实现
    2. size_t my_strlen(const char* str)
    3. {
    4. assert(str);//断言字符串不为空字符串
    5. int count = 0;//记录字符的个数
    6. while (*str != '\0')
    7. {
    8. count++;
    9. str++;
    10. }
    11. return count;
    12. }

    2 递归实现

    1. size_t my_strlen_1(const char* str)
    2. {
    3. assert(str);//断言字符串不为空字符串
    4. if (*str != '\0')
    5. {
    6. return 1 + my_strlen_1(str + 1);
    7. }
    8. else
    9. {
    10. return 0;
    11. }
    12. }

    3 指针-指针实现

    1. //指针-指针的方式实现
    2. int my_strlen(const char* str)
    3. {
    4. assert(str);//断言字符串不为空字符串
    5. char* start = str;//将arr的地址给start
    6. char* end = str;//arr地址给end
    7. while (*end != '\0')
    8. {
    9. //如果*end不等于'\0'
    10. end++;//指针++
    11. }
    12. return end - start;//指针-指针就是等于长度
    13. }

     我们知道strlen是如何计算字符串的,那该函数的使用有什么要注意的?

    注意点:

    字符串是以'\0'作为结束的标志,strlen是统计字符串'\0'之前的字符。

    参数指向的字符串必须要以 '\0' 结束

    字符串的返回类型是size_t类型。

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

    strcpy字符串拷贝函数

    strcat字符串追加函数

    strcmp字符串比较函数

     strcpy字符串拷贝函数

    定义

     参数

    strcpy( 目标字符串,源字符串);

    strcpy是一个字符串拷贝函数,能将源字符串拷贝到目标字符串中,

    返回类型是char*(返回的是目标字符串首的地址),

    头文件是<string.h>。

    strcpy使用举例: 

    1. int main()
    2. {
    3. char arr1[20] = "abcdefg" ;
    4. char arr2[] = "ping";
    5. strcpy(arr1, arr2);//拷贝字符串
    6. printf("%s\n", arr1);
    7. return 0;
    8. }

     这里我们要注意的是strcpy不仅仅把arr2中的字符拷贝过去,还把'\0'拷贝过去了。

     模拟实现strcpy

    1. char* my_strcpy(char* dest, const char* source)
    2. {
    3. assert(dest && source);//断言
    4. char* ret = dest;//保存好目标字符串的首地址
    5. while (*dest++ = *source++)
    6. {
    7. ;
    8. }
    9. return ret;
    10. }

    strcpy函数注意点:

    源字符串必须以 '\0' 结束。

    会将源字符串中的 '\0' 拷贝到目标空间。

    目标空间必须足够大,以确保能存放源字符串。

    目标空间必须可变。

    strcat字符串追加函数

    定义

     参数

     strcat( 目标字符串,源字符串);

    strcat是字符串追加函数,能够将源字符串的字符追加到目标字符串中。

    返回类型是char*(返回的是目标字符串首的地址),

    头文件是<string.h>。

     strcat使用举例: 

    1. int main()
    2. {
    3. char arr1[20] = "allow";
    4. char arr2[] = "act";
    5. strcat(arr1, arr2);//追加字符串
    6. printf("%s\n", arr1);
    7. return 0;
    8. }

     strcat模拟实现

    1. char* my_strcat(char* dest, const char* scoure)
    2. {
    3. assert(dest && scoure);//断言
    4. char* ret = dest;
    5. //找到目标字符串的'\0'
    6. while (*dest!=NULL)//这里不要用(*dest++)这样会导致跳过了'\0'
    7. {
    8. dest++;
    9. }
    10. //进行字符串的追加
    11. while (*dest++ = *scoure++)
    12. {
    13. ;
    14. }
    15. return ret;
    16. }

    注意点:strcat函数

    源字符串必须以 '\0' 结束。

    目标空间必须有足够的大,能容纳下源字符串的内容。

    目标空间必须可修改。

    不能自己给自己追加字符串,程序会崩溃。

    strcmp字符串比较函数

    定义

     参数

     strcmp(string1,string2);

    返回值

     

    strcmp是字符串比较函数,该函数是从二个字符串的元素开始,进行比较(比较本质为字母ascii码值的大小)。

    头文件是<string.h>。

     strcmp使用举例: 

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include<stdio.h>
    3. #include<string.h>
    4. \
    5. int main()
    6. {
    7. char* p1 = "abcdef";
    8. char* p2 = "afe";
    9. int ret = strcmp(p1, p2);
    10. if (ret > 0)
    11. {
    12. printf("常量字符串p1大于常量字符串p2\n");
    13. }
    14. else if (ret < 0)
    15. {
    16. printf("常量字符串p1小于常量字符串p2\n");
    17. }
    18. else
    19. {
    20. printf("常量字符串p1等于常量字符串p2\n");
    21. }
    22. return 0;
    23. }

    这里不少人可能会有疑问了,怎么是字符串p1<字符串p2,明明字符串p1有6个字符而字符串p2只有3个字符。

    这里我们就要分清楚strcmp函数不是比较字符串中的字符数量,以p1和p2举例,首先比较p1中的a和p2中的a发现二者相等,就继续往下比较,b和f的大小,很明显f是比b大的,所以strcmp就返回一个小于0的数。

    我们继续模拟首先strcmp函数加深理解

    1. int my_strcmp(const char* str1, const char* str2)
    2. {
    3. assert(str1 && str2);//断言
    4. while (*str1== *str2)
    5. {
    6. //判断str1和str2是否相等
    7. if (*str1 == '\0')//当str1==str2
    8. {
    9. return 0;
    10. }
    11. str1++;
    12. str2++;
    13. }
    14. //str1与str2不相等,比较大小
    15. return (*str1 - *str2);
    16. }

    strcmp函数

    注意点:

    理解好strcmp比较方法,便于我们正确的使用strcmp函数。

    喜欢的话点个赞在走吧!

     

  • 相关阅读:
    【kubernetes篇】使用Harbor仓库管理kubernetes镜像
    云计算考试题
    「Python」面向对象封装案例2——摆放家具(需求分析、示例代码)
    【Redis】几款redis可视化工具(推荐Another Redis Desktop Manager)
    ❋JQuery的快速入门2 jq鼠标滚轮
    时区-Linux Java ConnectorJ MySQL-时间戳-EverNote
    java---网络初始
    (原创)【B4A】一步一步入门08:ListView,列表、单行、双行、双行带图片、列表项样式(控件篇04)
    StarRocks入门到熟练
    OSPF高级特性 —— 管理距离(优先级)修改 + 外部路由的metric值的修改
  • 原文地址:https://blog.csdn.net/qq_61552595/article/details/125361777