• C/C++字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数


    个人主页点我进入主页

    专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

    C语言刷题

    欢迎大家点赞,评论,收藏。

    一起努力,一起奔赴大厂。

    目录

     

    1.前言 

    2strlen函数 

     3.strcpy函数

    4.strcat函数

    5.strcmp函数


     

    1.前言 

            对于字符串这一部分我们想到的大部分是字符串的创建,const修饰字符串,指针指向字符串,字符指针,字符数组这些内容,实际上在C语言中有一些字符函数和字符串函数。C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串 中或者 字符数组中。字符串常量 适用于那些对它不做修改的字符串函数。

    2strlen函数 

            对于strlen函数我们可以访问cplusplus网站cplusplus进行查阅,看一看strlen函数的参数是什么以及返回类型是什么样子的。b1d95859afe043a19e799ff492d654ef.png

             我们看到strlen函数的返回类型是size_t类型也就是无符号整数,它的类型是const char*str也就是字符串的地址,说到这里你有没有想到我们前面的笔试题,为什么在参数放字符元素会报错误,就是因为这里应该放字符的地址,由于字符串是用ASCLL码进行储存,二进制转化为十六进制,整形提升,就会形成一个野指针,产生报错。这个函数是计算字符的个数遇到’\0'结束,不计算’\0';例如我们想要计算某个字符串的长度,代码如下:

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

    运行结果如下:

    1ee0e2a3a2314fb198b5f20660abb35e.png

    我们可以模拟实现一个strlen函数代码如下:

    1. #include
    2. int my_strlen(const char* str)
    3. {
    4. const char* p = str;
    5. while (*p != '\0')
    6. {
    7. p++;
    8. }
    9. return p - str;
    10. }
    11. int main()
    12. {
    13. char arr[] = "abcdef";
    14. int ret = my_strlen(arr);
    15. printf("%d", ret);
    16. return 0;
    17. }

            在这里我们主要用到指针减指针来计算字符的个数,当然我们也可以通过计数器或递归来进行操作,在这里不进行详细讲解。


     3.strcpy函数

            我们进入cplusplus网站进行查阅strcpy的参数

    8afb6c22cee546d6b774e1aaa0899a5a.png

             我们可以看到strcpy函数的返回类型是char*参数是 char * destination, const char * source

    第一个参数是想要修改的字符串的指针,第二个参数是想要得到的字符出的指针由于第二个参数不需要我们修改,难免会出现错误,用const进行修饰。特别注意我们需要保证源字符串的长度必须大于第二个字符串的长度,否则会造成栈溢出的问题,导致程序崩溃。例如我们可以写一个程序来感受一下此函数的功能,代码如下:

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "abcdef";
    6. char arr1[] = "aaa";
    7. strcpy(arr, arr1);
    8. printf("%s\n", arr);
    9. return 0;
    10. }

    运行结果如下:

    3d08e896f8944990a3cedee949f9419f.png

    我们对函数strcpy进行模拟,代码如下:

    1. #include
    2. #include
    3. void my_strcpy(char* str1, const char* str2)
    4. {
    5. assert(str1 && str2);
    6. char* p = str1;
    7. while (*str2 != '\0')
    8. {
    9. *p = *str2;
    10. p++;
    11. str2++;
    12. }
    13. }
    14. int main()
    15. {
    16. char arr[20] = { 'a','b','c'};
    17. const char arr2[] = "ba";
    18. my_strcpy(arr, arr2);
    19. printf("%s", arr);
    20. }

            在这个函数中我们就是先记录字符串的首元素的地址,再定义指针进行赋值,直到‘\0’赋值完成,返回首元素的指针。

    4.strcat函数

             我们进入cplusplus网站进行查阅strcat的参数

    6a30913a45e54920be3f05ab0cc8939c.png

            此函数的返回类型是char*,参数是char * destination, const char * source,和strcpy函数一样它的第一个参数是想要修改的字符串的指针,第二个参数是想要得到的字符出的指针由于第二个参数不需要我们修改,难免会出现错误,用const进行修饰。我们想要进行字符串的连接,代码如下

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[100] = { 'a','b'};
    6. char arr1[] = "aaa";
    7. strcat(arr, arr1);
    8. printf("%s\n", arr);
    9. return 0;
    10. }

    运行结果如下:

    1b652a2673864f9fa794f6593698e778.png

    我们对strcat函数进行模拟,代码如下:

    1. #include
    2. #include
    3. void my_strcat(char* str1, const char* str2)
    4. {
    5. assert(str1 && str2);
    6. char* p = str1;
    7. while (*p != '\0')
    8. {
    9. p++;
    10. }
    11. while (*str2 != '\0')
    12. {
    13. *p = *str2;
    14. p++;
    15. str2++;
    16. }
    17. *p = *str2;
    18. }
    19. int main()
    20. {
    21. char arr[20] = { 'a','b','d','e','f' };
    22. const char arr2[] = "ghi";
    23. my_strcat(arr, arr2);
    24. printf("%s", arr);
    25. return 0;
    26. }

            在这里我们就是需要一个指针记录字符串的位置,一个移动,直到出现’\0‘然进修修改,注意需要两个字符串的总长度小于第一个字符串的容量。

    5.strcmp函数

    69253ccff649474a92abf69e2c7a252f.png

            此函数的返回类型是int,由于是对两个字符串进行比较所以不需要对字符串进行修改,所以用const进行修饰。

    9586c1451a804d05a2047a89f85b4b5a.png

            它的返回值是整形,如果第一个字符串大于第二个返回大于0的数,小于返回小于0的数,等于返回0,比较就是逐个进行比较从第一个开始,相同则后移比较不同则进行比较返回结果。例如代码:

    1. #include
    2. #include
    3. int main()
    4. {
    5. const char arr[] = "abcdefg";
    6. const char arr2[] = "abcdf";
    7. int ret = strcmp(arr, arr2);
    8. if (ret > 0)
    9. {
    10. printf(">");
    11. }
    12. else if (ret < 0)
    13. {
    14. printf("<");
    15. }
    16. else
    17. {
    18. printf("=");
    19. }
    20. return 0;
    21. }

    运行结果如下:

    cc359757c2e24ffe95312cc566039cb2.png

    我们对strcmp进行模拟实现,代码如下: 

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. int my_strcmp(const char* str1, const char* str2)
    5. {
    6. assert(str1&& str2);
    7. while (*str1 == *str2)
    8. {
    9. str1++;
    10. str2++;
    11. }
    12. return *str1 - *str2;
    13. }
    14. int main()
    15. {
    16. const char arr[] = "abcdefg";
    17. const char arr2[] = "abcdf";
    18. int ret = my_strcmp(arr, arr2);
    19. if (ret > 0)
    20. {
    21. printf(">");
    22. }
    23. else if (ret < 0)
    24. {
    25. printf("<");
    26. }
    27. else
    28. {
    29. printf("=");
    30. }
    31. return 0;
    32. }

    和上面叙述的一样,先找到不同的字符,进行相减,然后判断。

    今天的内容就结束了希望大家可以一键三连。

     

  • 相关阅读:
    think-rom(thinkphp) 数据库参数绑定bigint被处理成浮点数(科学计数)问题
    python集合的应用场景
    基于时间的盲注
    java-php-python-ssm糖果销售管理系统计算机毕业设计
    【附源码】计算机毕业设计java养老院老人日常生活管理系统设计与实现
    NVIDIA的jetson平台进行can通讯学习,最终实现can收发详细教程(精五)
    指针进阶(1)
    网络取证-Tomcat-简单
    【JVM】JVM的垃圾回收机制
    QML的使用
  • 原文地址:https://blog.csdn.net/Infernal_Puppet/article/details/133346000