• C语言—字符函数和字符串函数


    1.字符分类函数

    C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。

    这些函数的使用都需要包含一个头文件 ctype.h。

    例:将一句话中的小写字母改成大写字母。

    2.字符转换函数

    头文件:ctype.h

    C语言提供了2个字符转换函数:

    int  tolower(int c);//将参数传进去的大写字母转小写

    int  toupper(int c);//将参数传进去的小写字母转大写

    所以上述例题可以这些解决。

    3. strlen 的使用和模拟实现

    头文件:string.h

    size_t  strlen(const char* str)

    • 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含‘\0’)。
    • 参数指向的字符串必须要以 '\0' 结束。
    • 注意函数的返回值为 size_t ,是无符号的(易错)
    • strlen 的使用需要包含头文件
    • 学会 strlen 函数的模拟实现。

    注:size_t 的运算的最后的返回类型还是size_t(无符号整型)。

    3.1 strlen 的模拟实现

    1.计数器

    2.指针

    3.函数递归(没有创建第三变量)

    4. strcpy 的使用和模拟实现

    • 源字符串必须以 ‘\0’ 结束。
    • 会将源字符串中的 '\0' 拷贝到目标空间
    • 目标空间必须足够大,以确保能存放源字符串
    • 目标空间必须可修改

    4.1 模拟实现 strcpy

    5. strcat 的使用和模拟实现

    • 源字符串必须以 ‘\0’ 结束。
    • 目标字符串也得有 '\0' ,否则没办法知道追加从哪里开始。
    • 目标空间必须有足够的大,能容纳下源字符串的内容。
    • 目标空间必须可修改。

    5.1 模拟实现

    那么,如果字符串自己给自己追加会怎么样呢?

    在一些编译器中可能正常运行,但是在另一些编译器中,它可能就是无限循环下去了。

    6. strcmp 的使用和模拟实现

    • 第一个字符串大于第二个字符串,则返回大于0的数字
    • 第一个字符串等于第二个字符串,则返回0
    • 第一个字符串小于第二个字符串,则返回小于0的数字

    注:strncmp,strncat,strncpy。主要就是一个n的区别,请读者自行查看相关教程。

    7. strtok 函数

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

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

    8. strstr 的使用和模拟实现

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

    功能:在str1中找到str2这个字符串,第一次出现的位置,如果找到了,就返回这个第一次出现的起始地址。如果没找到,就返回NULL。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "abcdefabcdef";
    6. char* p = "efab";
    7. char* ret = strstr(arr, p);
    8. if (ret == NULL)
    9. {
    10. printf("不存在");
    11. }
    12. else
    13. {
    14. printf("%s", ret);
    15. }
    16. return 0;
    17. }

    8.1 模拟实现

    1. #include
    2. #include
    3. #include
    4. const char* my_strstr(const char* str1, const char* str2)
    5. {
    6. assert(str1 && str2);
    7. const char* s1 = str1;
    8. const char* s2 = str2;
    9. const char* cur = str1;
    10. if (*str2 == '\0')
    11. {
    12. return str1;
    13. }
    14. while (*cur)
    15. {
    16. s1 = cur;
    17. s2 = str2;
    18. while (*s1 && *s2 && *s1 == *s2)
    19. {
    20. s1++;
    21. s2++;
    22. }
    23. if (*s2 == '\0')
    24. return cur;
    25. cur++;
    26. }
    27. return NULL;
    28. }
    29. int main()
    30. {
    31. char arr[] = "abcdefabcdef";
    32. char* p = "cdef";
    33. const char* ret = my_strstr(arr, p);
    34. if (ret == NULL)
    35. {
    36. printf("不存在");
    37. }
    38. else
    39. {
    40. printf("%s", ret);
    41. }
    42. return 0;
    43. }

    9. strerror 函数的使用

    strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

    在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是会对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。perror就是直接将错误码对应的错误信息打印出来。

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. //打开文件
    7. FILE* PF = fopen("data.txt", "r");//"r"——以读文件的形式打开文件,如果文件不存在,就打开失败,返回空指针。
    8. if (PF == NULL)
    9. {
    10. printf("文件打开失败,原因是:%s", strerror(errno));
    11. perror("文件打开失败,原因是:");
    12. //perror == printf + strerror
    13. return 1;
    14. }
    15. else
    16. {
    17. printf("打开文件成功");
    18. //。。。。
    19. fclose(PF);
    20. PF = NULL;
    21. }
    22. return 0;
    23. }

    作者自述:本文主要针对C语言的字符串函数的知识。内容中包含了很多总结内容。本文制作不易,求求动动你们发财的小手点个赞和关注,这是对我创造最大的动力。后续我也会跟进内容,尽量一周至少一次,保证内容的质量。如果有想知道的内容或者有建议的地方,欢迎后台私信或者在本文留言哦。感谢各位的支持捏Thanks♪(・ω・)ノ。

  • 相关阅读:
    【jmeter+ant+jenkins】之搭建 接口自动化测试平台
    【Win】怎么下载m3u8视频\怎么通过F12开发人员工具获取视频地址\怎么下载完整的.ts格式视频
    负载均衡:实现高效稳定的网络服务
    Python Selenium 八大元素定位方法(上)
    HCIP学习--扩展知识点
    基于springboot实现学生综合测评系统项目【项目源码+论文说明】
    理解ASP.NET Core - 发送Http请求(HttpClient)
    【附源码】计算机毕业设计JAVA家庭记账系统
    Linux-实用操作(黑马学习笔记)
    uniapp 声音提示、震动提示、语音播报插件 Ba-Beep
  • 原文地址:https://blog.csdn.net/l1894/article/details/139424400