• 字符串函数(三)


    目录

    学习目标:学会使用strstr、strtok、strerror函数并自主实现

    学习内容:

    学习产出:

    1.1.1 strstr函数

    1.1.2 自主实现strstr函数

    1.2strtok函数

    1.3 strerror函数


    学习目标:学会使用strstr、strtok、strerror函数并自主实现

    学习内容:

    字符串查找
    strstr
    strtok
    错误信息报告
    strerror

    学习产出:

    1.1.1 strstr函数

    char * strstr ( const char *str2, const char * str1);

    该函数用于查看字符串str2中是否存在子串str1,若存在则返回str2首次出现的地址,否则返回空指针NULL。

    1.1.2 自主实现strstr函数

    此代码引入s1、s2、cur是因为如果找到了第一个相同时p1++和p2++判断下一个,但如果下一个不相同时,此时我们会丢失了原来的位置,无法回去。

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. char *my_strstr(const char*p1, const char*p2)
    5. {
    6. assert(p1&&p2);
    7. char *s1 = NULL;
    8. char *s2 = NULL;
    9. char*cur = (char*)p1;//cur用于记录当前的指针位置
    10. if (*p2) //判断p2是否是空字符
    11. {
    12. return (char*)p1;
    13. }
    14. while (*cur) //遍历p1,用*cur判断p1是否遍历完
    15. {
    16. s1 = cur;
    17. s2 = (char*)p2;
    18. while(*s1 && *s2 && (s1 == s2)) //寻找到相同时
    19. {
    20. s1++;
    21. s2++;
    22. }
    23. if (*s2=="\0") //如果s2即p2为\0说明s2遍历完也证明p2是p1的字串
    24. {
    25. return (cur);
    26. }
    27. cur++;
    28. }
    29. return NULL;
    30. }

    1.2strtok函数

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

    该函数会寻找字符串(str)中的字符串(sep),以sep分割字符串str。

    注:

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

    如果字符串中不存在更多的标记,则返回NULL 指针。

    举例说明红色字:

    第一次使用此函数时,参数需要给全strtok(str, ",.-"),此时它会以sep字符串的第一个字符(,)分割str,重点是会保存剩下字符串的地址并返回切割出来的那段地址,所以之后使用strtok时第一个参数可以给NULL.(自己用下面代码探讨一下吧)

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. int main()
    5. {
    6. char str[] = "This,a -sample. string";
    7. char * pch;
    8. printf("%s\n", str);
    9. pch = strtok(str, ",.-");
    10. printf("%s\n", pch);
    11. printf("%s\n", str);
    12. pch = strtok(NULL, ",.-");
    13. printf("%s\n", pch);
    14. printf("%s\n", str);
    15. pch = strtok(NULL, ",.-");
    16. printf("%s\n", pch);
    17. pch = strtok(NULL, ",.-");
    18. printf("%s\n", pch);
    19. return 0;
    20. }

    1.3 strerror函数

    char * strerror ( int errnum );

    当代码出现错误时,该函数会将错误码转换为错误信息,提示报错的原因。

    errno是一个全局的错误码的变量,当C语言的库函数执行过程中,发生了错误,就会把对应的错误码复制到errno中,然后会对应函数strerror中定义的信息返回。

    举例说明:用函数打开一个文件,因为这个文件我们没有创建的,所以会打开失败并返回NULL,所以在if 结构里打印strerror(errno)即可看到错误的原因。

    1. #include
    2. #include
    3. #include //必须包含的头文件
    4. int main ()
    5. {
    6. FILE * pFile;
    7. pFile = fopen ("unexist.ent","r"); //打开一个文件
    8. if (pFile == NULL)
    9. printf ("Error opening file unexist.ent: %s\n",strerror(errno));
    10. return 0;
    11. }

    后面两个函数自主实现有点难度的,有大佬实现了可以发我一下。

    争取每次学习都能掉十根头发,不掉头发的程序员不是好程序员。

                                                                                                             ——Ace Young
     

  • 相关阅读:
    html5期末大作业——HTML+CSS公益关爱残疾人( 6个页面)
    【Python 千题 —— 基础篇】分句成词
    校招面试数据库原理知识复习总结三之SQL语句
    Rust中的单元测试
    R语言、Meta分析、MATLAB在生态环境领域里的应用
    Confluence 内容管理
    归并排序-Python
    网络编程(IP、端口、协议、UDP、TCP)【详解】
    第十一章《搞懂算法:聚类是怎么回事》笔记
    小分子CDK9抑制剂 | MedChemExpress
  • 原文地址:https://blog.csdn.net/ACE_YOUNG/article/details/125942302