• 字符函数和字符串函数的使用及模拟实现(上)


                                                                                                               超佳出品

    前言

    重点介绍处理 字符和字符串 的库函数的使用和注意事项

    一、函数介绍

    1.strlen

     strlen,是字符串长度的函数

    返回类型为 size_t 及无符号整型unsigned int    因为字符串长度必定都为正数,不可能出现负数,所以将返回值设置为无符号数会更加合适。

    参数为char *类型的指针   要求字符串的长度,应该将字符串的首地址传过去,所以参数为char*

    2.注意事项:

         strlen返回类型为无符号整型,所以在比较两个字符串长度的时候,要格外注意!!

    1.strlen ( str2 ) - strlen ( str1 ),其返回类型都是无符号整型,做运算时,结果自然也是无符号整型,原码反码补码都是一样的,结果永远为大于零的数。结果一直为  >.
    2.strlen遇到字符串位置的 ‘\0’,会停下来,斜杠零之前字符个数,及字符串的长度!
         结果我们可知,在字符串存储时,斜杠零会自动在字符串的结尾处添加,但若单独存字符的话,是没有斜杠零存储进去的,所以会出现arr2长度为18的情况!
         申请内存时,它的前后都是有其他内存空间的,所以我们不保证其他空间中,是否有斜杠零,所以strlen(arr2)=16结果是随机值!

    2.strcpy

     Copy a string,显而易见,拷贝字符串

    返回类型char *指针,参数为目的字符串的地址,源字符串的地址

                                      及(源字符串要拷贝到目的字符串中)

    2.注意事项

    1.源字符串中必须要有斜杠零,当拷贝过程中,遇到斜杠零会停止拷贝!

    2. 会将源字符串中的 '\0' 拷贝到目标字符串中
    3.要注意,目的字符串的空间一定要大于源字符串空间,不然会报错,拷贝失败!

    3.strcat

     Append a string.     append增补,追加

    追加字符串

    返回类型 char *,返回目的字符串的地址

    参数,目的字符串地址和源字符串地址,类型都为char *。

    2.注意事项

    1.source字符串  追加在 dest字符串中,在目的字符串斜杠零位置开始追加,追加结束后,会自动带一个斜杠零。

     2.目的字符串空间要大,足够追加!

    3.源字符串中,必须要有斜杠零。

    4.你是不是有自己追加自己的这种想法?当然不行!

    追加过程中,会将源字符串中的斜杠零覆盖掉,导致字符串中没有斜杠零,即没有停止的位置,会一直死循环下去!

    4.strcmp

    compare string,比较字符串

    返回类型为int

    参数为 字符串1 和 字符串2 的地址,类型为char* 

    比较规则

    举例一:

    举例二:

    是不是看出一些眉目?比较字符串当然不是看字符串的长度!比较的是每一对字符的大小,ASCII码值的大小

    第一个例子:

    第一对相等'a'= 'a',第二对 'a'< 'b' ,所以字符串2大于字符串1,后面的无需比较。

    第二个例子明白了吧!



    长度受限的字符串函数

    5.strncpy

    多增加了一个字节个数,即拷贝几个字节,更加有了限制

    这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

    6.strncat

    多增加了一个字节个数,即追加几个字节,更加有了限制

    这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

     

    7.strncmp

    多增加了一个字节个数,即比较几个字节,更加有了限制

    这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

    二、模拟实现

    1.strlen

    代码如下(示例):

    法一:计数器方式

    1. #include
    2. #include
    3. int my_strlen(char* p)
    4. {
    5. assert(str); //防止str为空指针
    6. int count = 0;
    7. while (*p++)
    8. {
    9. count++;
    10. }
    11. return count;
    12. }
    13. int main()
    14. {
    15. char arr[] = "abcdef";
    16. int ret = my_strlen(arr);
    17. printf("%d", ret);
    18. return 0;
    19. }

    法二:递归,不创建临时变量

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

    法三:指针减指针

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

    2.strcpy

    代码如下(示例):

    1. #include
    2. #include
    3. char * my_strcpy(char* dest, const char* src)
    4. {
    5. assert(dest && src);
    6. char* p = dest;
    7. while (*dest++ = *src++);
    8. return p;
    9. }
    10. int main()
    11. {
    12. char arr1[] = "aaaaaaaaa";
    13. char arr2[] = "bbbbbbbb";
    14. my_strcpy(arr1,arr2);
    15. printf("%s", arr1);
    16. }

    3.strcat

    代码如下(示例):

    先找斜杠零,再拷贝.

    1. #include
    2. #include
    3. char* my_strcat(char* dest,const char* src)
    4. {
    5. char* p = dest;
    6. assert(dest && src);
    7. while (*dest)
    8. {
    9. dest++;
    10. }
    11. while (*dest++ = *src++);
    12. return p;
    13. }
    14. int main()
    15. {
    16. char arr1[20] = "aaaaaa";
    17. char arr2[] = "bbbbbbbb";
    18. my_strcat(arr1,arr2);
    19. printf("%s", arr1);
    20. return 0;
    21. }

    4.strcmp

    代码如下(示例):

    1. #include
    2. #include
    3. int my_strcmp(const char* str1, const char* str2)
    4. {
    5. assert(str1 && str2);
    6. //法一
    7. while (*str1)
    8. {
    9. while (*str1 != *str2)
    10. {
    11. return *str1 - *str2;
    12. }
    13. str1++;
    14. str2++;
    15. }
    16. return 0;
    17. //法二
    18. while (*str1 == *str2)
    19. {
    20. if (*str1=='\0')
    21. return 0;
    22. str1++;
    23. str2++;
    24. }
    25. return *str1 - *str2;
    26. }
    27. int main()
    28. {
    29. char arr1[] = "abddd";
    30. char arr2[] = "abc";
    31. int ret=my_strcmp(arr1,arr2);
    32. if (ret > 0)
    33. printf("str1大\n");
    34. else if (ret < 0)
    35. printf("str2大\n");
    36. else
    37. printf("一样大\n");
    38. return 0;
    39. }

    5.strncat

    1. void my_strncat(char* dest, char* src, int n)
    2. {
    3. while (*dest)
    4. {
    5. dest++;
    6. }
    7. while (n--)
    8. {
    9. *dest++= *src++;
    10. }
    11. *dest = '\0';
    12. }
    13. int main()
    14. {
    15. char arr1[6] = "aa";
    16. char arr2[] = "bbbbb";
    17. my_strncat(arr1, arr2,3);
    18. printf("%s", arr1);
    19. }

    总结

       在使用字符串函数的时候,要注意的是函数的返回值和参数的使用,以及源字符串和目的字符串的空间大小!

           我们下期再见!

  • 相关阅读:
    A First Look At Java
    SpringCloud Gateway用法详解
    智能晾衣架(一)--设计
    【Hot100】LeetCode—84. 柱状图中最大的矩形
    windows系统go环境配置
    【网络协议】聊聊UDP协议
    【C++】最通俗的多态、虚表、虚指针讲解
    [模型]多目标规划模型
    MacBook将iPad和iPhone备份到移动硬盘
    Python寻找包的安装位置
  • 原文地址:https://blog.csdn.net/ChaoFreeandeasy_/article/details/125987427