• ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】


    欢迎来CILMY23的博客喔,本期系列为​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】,图文讲解各种字符串函数,带大家更深刻理解C语言中各种字符串函数的应用,感谢观看,支持的可以给个赞哇。 

    前言

    上一篇说到,有不受长度限制的字符串函数,它们分别是strcpy,strcat,strcmp,为了方便我们想要长度限制,C语言提供了三个加n的函数,strncpy,strncat,strncmp函数,本期将了解剩下的三个字符串函数,它们分别是strstr,strtok,strerror。

    目录

     一、strstr

    二、strtok

    三、strerror


     一、strstr 

     strstr函数可以在cplusplus中查到,strstr - C++ Reference (cplusplus.com)

    函数原型如下:

    1. const char * strstr ( const char * str1, const char * str2 );
    2. char * strstr ( char * str1, const char * str2 );

     函数介绍如下:

    返回值和使用案例:

     

    strstr的使用

     strstr函数功能就是返回str2在str1中第一次出现的位置,如果str2没有在str1中出现,就返回NULL

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr1[] = "hello CILMY23";
    6. char arr2[] = "C";
    7. char* ret = strstr(arr1, arr2);
    8. if (ret != NULL)
    9. printf("%s \n", ret);
    10. else
    11. printf("找不到\n");
    12. ret = strstr(arr2, arr1);
    13. if (ret != NULL)
    14. printf("%s \n", ret);
    15. else
    16. printf("找不到\n");
    17. return 0;
    18. }

    结果如下:

     strstr的模拟实现

    为了检验自己写的是否对不对,我们拿出几组的测试用例

    1. void Judge(char* p)
    2. {
    3. if (p != NULL)
    4. printf("%s \n", p);
    5. else
    6. printf("找不到\n");
    7. }
    8. int main()
    9. {
    10. char arr1[] = "hello CILMY23";
    11. char arr2[] = "C";
    12. char arr3[] = "lllC";
    13. char arr4[] = "This is a simple string";
    14. char arr5[] = "";
    15. char* ret = strstr(arr1, arr2);
    16. Judge(ret);
    17. ret = strstr(arr2, arr1);
    18. Judge(ret);
    19. ret = strstr(arr3, arr1);
    20. Judge(ret);
    21. ret = strstr(arr3, arr2);
    22. Judge(ret);
    23. ret = strstr(arr1, arr3);
    24. Judge(ret);
    25. ret = strstr(arr2, arr3);
    26. Judge(ret);
    27. ret = strstr(arr4, "simple");
    28. Judge(ret);
    29. ret = strstr(arr1, arr5);
    30. Judge(ret);
    31. return 0;
    32. }

     这组测试用例的结果是:

    思路一 

     思路解析:

    遍历源字符串,找到与字符串2首字母相同的字符,进入循环2,但在进入之前需要保存一份当前位置,然后我们再去利用新开辟出来的两个指针去遍历两个字符串,如果有不相等的地方,那么字符串肯定是走不到尾巴的,也就是不可能等于'\0',此时继续遍历字符串1,直到字符串1遍历结束,完成整个字符串的查找,没有就返回NULL。

    1. char * my_strstr(const char* str1,const char* str2)
    2. {
    3. assert(str1 && str2);
    4. char* str3 = NULL;
    5. char* str4 = NULL;
    6. while (*str1 != '\0')
    7. {
    8. str4 = str2;
    9. str3 = str1;
    10. while(*str3 == *str4 && *str3 && *str4)
    11. {
    12. str3++;
    13. str4++;
    14. }
    15. if (*str4 == '\0')
    16. return str1;
    17. str1++;
    18. }
    19. return NULL;
    20. }

     逻辑图如下:

    代码优化

    代码优化解析:

    1.我们并不希望在遍历字符串的时候所有的值都被修改,包括我后续返回的地址,所以全部都可以用const修饰

    2.当我第二个字符串为空的时候,返回字符串1的地址,就相当于你让我在一个字符串里找什么都没有的东西,库里设计是返回第一个字符串地址

    3.我们不希望改变原有的地址,str1,和str2,所以再创建一个指针变量用来代替上述str1的使用 

    1. const char* my_strstr(const char* str1, const char* str2)
    2. {
    3. assert(str1 && str2);
    4. const char* cp = str1;
    5. const char* s1 = NULL;
    6. const char* s2 = NULL;
    7. if (*str2 == '\0')
    8. {
    9. return str1;
    10. }
    11. while (*cp)
    12. {
    13. s1 = cp;
    14. s2 = str2;
    15. while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
    16. {
    17. s1++;
    18. s2++;
    19. }
    20. if (*s2 == '\0')
    21. {
    22. return cp;
    23. }
    24. cp++;
    25. }
    26. return NULL;
    27. }

    根据测试用例跑出来的结果如下: 

     

    二、strtok

    了解strtok函数之前,我们要先了解一个概念,相信大家都看过IP地址, 计算机网络通信协议是用的IP协议,于是链接进互联网的设备会有一个IP地址,这个IP地址,IP地址通常用“点分十进制”表示成(a.b.c.d)的形式

    例如:192.168.1.23

     IP地址的本质还是一个整数,因为不好记,才有了点分十进制的表示方式。

    那如果我们想把这个IP地址的每个数字取出来就会用到,strtok这个函数。又或者你想把邮箱的域名,邮箱名,域名后缀取出来也会用到strtok这个函数。其中@和.这种东西我们就把它称作分隔符

    strtok网站以及函数原型如下:

    strtok - C++ Reference (cplusplus.com)

    char * strtok ( char * str, const char * delimiters );

     strtok的函数介绍:

     

    返回值和使用案例: 

    strtok的使用

    1. #include
    2. #include
    3. int main()
    4. {
    5. char str1[] = "hello.CIL.MY@23";
    6. char buf[60] = { 0 };
    7. strcpy(buf, str1);
    8. char* p = ".@";
    9. char* r = NULL;
    10. for (r = strtok(buf, p); r != NULL; r = strtok(NULL, p))
    11. {
    12. printf("%s", r);
    13. }
    14. return 0;
    15. }

    打印结果如下:

     strtok总结:

    •    sep参数指向⼀个字符串,定义了用作分隔符的字符集合
    •    第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记
    •    strtok函数找到str中的下⼀个标记,并将其用\0 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。)
    •    strtok函数的第⼀个参数不为NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。
    •    strtok函数的第⼀个参数为NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
    •    如果字符串中不存在更多的标记,则返回NULL 指针。

    三、strerror

    strerror 的网址:

    strerror - C++ Reference (cplusplus.com) 

    函数原型:

    char * strerror ( int errnum );

    函数介绍如下: 

    函数的功能及使用案例:

     函数解析:

    strerror是一个返回错误码所对应的错误字符串的起始地址,在C语言的库函数中设计错误码,当我们库函数在调用过程中发生错误信息了,要记录下来,这就是错误码。是一个编码。

    当库函数调用失败的时候,会将错误码记录到变量errno当中,errno是C语言中的一个全局变量。

    strerror的使用

    1. int main()
    2. {
    3. int i = 0;
    4. for (i = 0; i < 10; i++)
    5. {
    6. printf("%d:%s \n",i,strerror(i));
    7. }
    8. return 0;
    9. }

     结果如下:

     

  • 相关阅读:
    学习模板发布
    洗衣行业在线预约小程序系统源码搭建 支持直播功能+在线预约下单+上门取件
    Java爬虫的使用案例及简单总结
    3. Java 数据类型
    95后工程师上班哼小曲?那些愉快上班的打工人,到底怎么做到的?
    MySQL数据库复习——事务
    在Spring Boot微服务使用RedisTemplate操作Redis集群
    C# OpenVino Yolov8 Detect 目标检测
    Android 多桌面图标启动, 爬坑点击打开不同页面
    numpy函数查询手册
  • 原文地址:https://blog.csdn.net/sobercq/article/details/136187589