• 需要知道的字符串函数


    前言

    者:小蜗牛向前冲

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

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

    本次博主将继续上篇博客对字符串函数进行进一步的补充。

    目录

    长度受限制的字符串函数介绍

     字符串查找函数

    报告错误信息

    字符分类函数


    长度受限制的字符串函数介绍

    啥长度受限制的字符串函数呢?它是相对于长度不受限制的字符串函数(strcmp,strcpy,strcat)这些函数他们都是遇到'\0'才会停止函数的功能,但这些会存在一些不安全的情况,以strcpy字符串拷贝函数举例,当存放目标字符串空间比源字符串小时,拷贝仍然会进行,从而导致程序崩溃。

     所以,为了更加安全的使用相应功能,长度受限制的字符串函油然(strncmp,strncpy,strncant)。下面我会为大家一一刨析。

    strncpy函数

    定义

    参数 

    strncpy(strDest,strSource,count);

    其中的strDest指目标字符串

    strSource指源字符串

    count指要要从源字符串中拷贝到目标字符串的字符个数。

    举例实现

    1. int main()
    2. {
    3. char arr1[5] = "he";
    4. char arr2[10] = "hehewang";
    5. strncpy(arr1, arr2, 4);//受限制的字符串拷贝
    6. printf("%s\n", arr1);
    7. return 0;
    8. }

     下面我们继续模拟实现strncpy函数

    1. char* my_strncpy(char* dest, char* source, size_t count)
    2. {
    3. assert(dest && source);//断言
    4. char* start = dest;//保存好目标字符串的地址
    5. while (count && (*dest++ = *source++) != '\0')
    6. {
    7. count--;//每拷贝一个要拷贝的字符就少一个
    8. }
    9. if (count)//若conut指的字符个数大于拷贝个数
    10. while (--count)
    11. *dest++ = '\0';//超出的部分都置0
    12. return (start);
    13. }

     对于strncpy是为更加安全的使用字符串拷贝而出现的函数。

    功能:

    可以根据自己的需求拷贝多少个字符。

    头文件:

    <string.h>.

    返回值:

    返回的是目标字符串的首地址。

    strncmp函数

    定义

     参数

     strncmp(str1,str2,count);

    返回值

    我们知道strncmp和strcmp的功能是及其相似的,但strncmp更加高明的地方是能实现我们想要的字符进行比较。

     举例说明

    1. int main()
    2. {
    3. char* p1 = "abcdfeg";
    4. char* p2 = "abed";
    5. int ret = strncmp(p1, p2, 3);
    6. if (ret > 0)
    7. {
    8. printf("p1>p2\n");
    9. }
    10. else if (ret < 0)
    11. {
    12. printf("p1<p2\n");
    13. }
    14. else
    15. {
    16. printf("p1=p2");
    17. }
    18. return 0;
    19. }

     模拟strncpy

    1. int my_strncmp(const char* p1, const char* p2, size_t count)
    2. {
    3. assert(p1 && p2);//断言
    4. //首先判断是否相等
    5. while ((*p1 == *p2)&&count)
    6. {
    7. count--;//每判断一个字符就--
    8. if (count==0)
    9. {
    10. return 0;//p1==p2
    11. }
    12. p1++;
    13. p2++;
    14. }
    15. return (*(unsigned char*)p1 - *(unsigned char*)p2);//返回
    16. }

    功能

    对字符串经行有限制的比较

    头文件

    <string.h>

     strncat函数

    定义

     参数

     strncat(dest,Soure,count);

    strncat是有限制的追加字符串。

    返回值是返回目标字符串的首地址

    头文件 <string.h>

    举例说明 

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include<stdio.h>
    3. #include<string.h>
    4. int main()
    5. {
    6. char arr1[10] = "menace";
    7. char arr2[5] = "mehe";
    8. strncat(arr1, arr2, 2);
    9. printf("%s\n", arr1);
    10. return 0;
    11. }

     模拟实现

    1. char* my_strncat(char* dest, const char* source, size_t count)
    2. {
    3. assert(dest && source);//断言
    4. //找到目标字符串的'\0'
    5. char* start = dest;
    6. while (*dest != '\0')
    7. {
    8. dest++;
    9. }
    10. while (count && (*dest++ = *source++))//进行追加
    11. {
    12. count--;
    13. }
    14. *dest = '\0';//在目标字符串末尾放上字符串结束的标志
    15. return start;
    16. }

    可能有不有疑问,回目标字符串的首地址有上面用呢?我暂时想到的是便于打印字符串。

     字符串查找函数

    下面我将为大家主要介绍C语言字符串查找函数(strstr,strtok)

    strstr函数

    定义

     参数

     strstr(str1,str2);

    功能

    strstr函数用来寻找子字符串的,是寻找str1中是否存在str2的子字符串

    返回值

    返回指向 str1 中第一次出现的 str2 的指针,如果子字符串不存在,那么就返回空指针。

    头文件

    <string.h>

    举例说明

    1. int main()
    2. {
    3. char* p1 = "amcdefme";
    4. char* p2 = "def";
    5. char* ret = strstr(p1, p2);//存储函数的返回值
    6. if (NULL == ret)
    7. {
    8. printf("子串不存在\n");
    9. }
    10. else
    11. {
    12. printf("%s\n", ret);//打印找到的子字符串
    13. }
    14. return 0;
    15. }

    注意如果出现而份子字符串,函数返回的第一次出现子字符串的首地址。

    模拟实现strstr

    1. char* my_strstr(const char* p1, const char* p2)
    2. {
    3. assert(p1 && p2);//断言
    4. char* s1 = NULL;
    5. char* s2 = NULL;//准备二个char*类型的空指针
    6. char* pt = (char*)p1;//存放找到子字符串的起始地址
    7. //判断p2是否为空指针
    8. if (*p2 == '\0')
    9. {
    10. return (char*)p1;//子字符串必定存在
    11. }
    12. //开始查找是否存在子字符串
    13. while (*pt)
    14. {
    15. s1 = pt;//指向要查找的位置
    16. s2 = (char*)p2;//指向要子字符串
    17. while (*s1 && *s2 && (*s1 == *s2))//逐个分析字符串是否相等,从而推断子字符串是否存在
    18. {
    19. s1++;
    20. s2++;
    21. }
    22. if ('\0' == *s2)//说明找到了子字符串
    23. {
    24. return pt;//返回子字符串第一次出现的的首地址
    25. }
    26. pt++;//没找到继续向下找
    27. }
    28. return (char*)NULL;//没找到
    29. }

    这个模拟实现还是比较经典的,有兴趣的小伙伴可以动手尝试。

    strtok函数

    定义

     参数

    strtok(strToken,strDelimit)

    strDelimit参数是个字符串,定义了用作分隔符的字符集合

    第一个参数指定一个字符串,它包含了0个或者多个由strDelimi字符串中一个或者多个分隔符分割的标记。

    strtok函数找到strToken中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)

    strtok函数的第一个参数不为 NULL ,函数将找到strToken中第一个标记,strtok函数将保存它在字符串中的位置。

    strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

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

     strtok举例说明

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include<stdio.h>
    3. #include<string.h>
    4. int main()
    5. {
    6. char arr[] = "990.321@321*100";//字符串
    7. char p[] = ".@*";//分隔符
    8. char* ret = NULL;
    9. for (ret = strtok(arr, p);ret != NULL;ret = strtok(NULL, p))
    10. {
    11. printf("%s\n",ret);//打印分割的字符串
    12. }
    13. return 0;
    14. }

    报告错误信息

    下面我将继续为大家分享,报告错误信息函数strerror函数

    定义

     参数

     strerror函数

    能够获取系统错误消息 (strerror) 或打印用户提供的错误消息 (_strerror)。

    返回值:

    strerror 和 _strerror返回指向错误消息字符串的指针。对 strerror 或 _strerror 的后续调用可能会覆盖该字符串。

    头文件:

    <string.h>

    举例说明 

    char* str = strerror(errno)

    //errno是一个全局的错误码的变量

    //当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno。

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include<stdio.h>
    3. #include<string.h>
    4. int main()
    5. {
    6. FILE* pf = fopen("test.txt", "r");//查找文件
    7. if (pf == NULL)
    8. {
    9. printf("%s\n", strerror(errno));
    10. }
    11. else
    12. {
    13. printf("open file success\n");
    14. }
    15. return 0;
    16. }

     

     注意:

    我们这里借用fopen函数能够打开文件的函数,其中的参数1(指的是文件),参数2(指的是打开文件的方式)

    FILE*是一种指针类型。

    这里当系统读不到此文件时,通过strerror(errno)我们能够将错误信息该我们展示出来。

    对于strerror函数总结:

    strerror()能将代码执行过程中的错误,报出了。

    strerror()的参数是1,2,3,4,5.......这类型的错误码,我们可以用errno全局的静态变量接收。

    字符分类函数

    在c语言中有许多字符分类函数,下面我们用图表来展示:

    函数如果他的参数符合下列条件就返回真
    iscntrl任何控制字符
    isspace空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
    sdigit十进制数字 0~9
    isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
    islower小写字母a~z
    isupper大写字母A~Z
    isalpha字母a~z或A~Z
    isalnum字母或者数字,a~z,A~Z,0~9
    ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
    isgraph任何图形字符        
    isprint任何可打印字符,包括图形字符和空白字符

    下面我们对部分字符分类函数经行说明

    islower函数判断字符是否为小写字母

    定义 

    参数

     举例说明

    1. int main()
    2. {
    3. char ret = 0;
    4. scanf("%c", &ret);
    5. if (islower(ret) != '\0')
    6. {
    7. printf("小写字母\n");
    8. }
    9. else
    10. {
    11. printf("不是小写字母\n");
    12. }
    13. return 0;
    14. }

     下面就不继续为大家介绍了,大家兴趣的话,可以动手去研究。

    总结

    在这篇博客,主要为大家介绍了,strncpy,strncmp,strncat这些受限制的字符串函数;与字符查找函数strstr(查找子字符串),strtok(查找被分隔符分割的字符串);及报告错误信息函数strerror和字符分类函数

     

  • 相关阅读:
    Maven------pom.xml详解
    对文件的 SQL 式运算
    Redis面试题(三)
    天才基本法中预测犯罪发生地点的数学建模真的可以为所欲为【全国大学生数学建模竞赛】
    043:mapboxGL鼠标点击提示source属性信息
    如何在vi编辑器中复制内容到终端
    HandlerInterceptorAdapter+WebMvcConfigurer实现自定义拦截器
    【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache抽象详解的核心原理探索
    Java 简易版王者荣耀
    记录将excel表无变形的弄进word里面来
  • 原文地址:https://blog.csdn.net/qq_61552595/article/details/125374755