字符串函数的模拟实现(strlen、strcpy、strcat、strcmp)

傷城~ 2021-09-07 06:10 453阅读 0赞

文章目录

  • 一、strlen
    • 1.库函数中的strlen
    • 2.模拟实现strlen
      • (1)计数器实现
      • (2)递归实现
  • 二、strcpy
    • 1.库函数中的strcpy
    • 2.模拟实现strcpy
  • 三、strcat
    • 1.库函数中的strcat
    • 2.模拟实现strcat
  • 四、strcmp
    • 1.库函数中的strcmp
    • 2.模拟实现strcmp
  • 感谢阅读,如有错误请批评指正

一、strlen

1.库函数中的strlen

库函数中的strlen是用来求字符串长度的(不包含’\0’)

用法如下:

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

在这里插入图片描述

2.模拟实现strlen

(1)计数器实现

思路:定义一个计数器count,从0开始,当字符串元素不为’\0’时,count++,为’\0’时停止

代码如下(示例):

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

(2)递归实现

思路:以字符串”abcdef”为例

strlen(“abcdef”)
=1 + strlen(“bcdef”)
=1 + 1 + strlen(“cdef”)
=1 + 1 + 1 + strlen(“def”)
=1 + 1 + 1 + 1 + strlen(“ef”)
=1 + 1 + 1 + 1 + 1 + strlen(“f”)
=1 + 1 + 1 + 1 + 1 + 1 = 6

代码如下(示例):

  1. int my_strlen2(char* p)//p指向字符串的首元素
  2. {
  3. if (*p != '\0')
  4. //直到找到'\0'为止
  5. return 1 + my_strlen2(p + 1);
  6. //p+1指向字符串的下一个元素
  7. else
  8. return 0;
  9. }
  10. int main()
  11. {
  12. char arr[] = "abcdef";
  13. sum = my_strlen2(arr);
  14. printf("%d\n", sum);//sum = 6
  15. return 0;
  16. }

二、strcpy

1.库函数中的strcpy

库函数中的strcpy可拷贝字符串。
char* strcpy(char* dest, const char* src);
表示将字符串src中的内容拷贝到字符串dest中(包含’\0’)并返回dest的地址。

用法如下:

  1. int main()
  2. {
  3. char arr1[50] = "******************";
  4. char arr2[] = "hello world!";
  5. char* parr1 = strcpy(arr1, arr2);
  6. //将arr2中的内容拷贝到arr1中,并返回arr1的地址
  7. printf("%s\n", arr1);
  8. printf("%s\n", parr1);
  9. return 0;
  10. }

在这里插入图片描述

2.模拟实现strcpy

思路:遍历数组src中的每一个元素,并将每一个元素放入dest中。

代码如下(示例):

  1. void my_strcpy(char* dest, char* src)
  2. {
  3. while (*src != '\0')
  4. {
  5. *dest = *src;
  6. dest++;
  7. src++;
  8. }
  9. *dest = *src;
  10. //将'\0'拷贝到dest中
  11. }

以上代码是strcpy的基本功能。
针对以上代码可以进行进一步优化。

代码如下(示例):

  1. //库函数中strcpy的返回值是dest的地址
  2. char* my_strcpy(char* dest, const char* src)
  3. //src中的内容不应被改变,加上const来保护
  4. {
  5. //assert防止出现指向NULL的指针
  6. assert(dest != NULL);
  7. assert(src != NULL);
  8. //assert(dest && src);这种写法也可以
  9. char* p = dest;//记录目标数组的地址
  10. while (*dest++ = *src++)
  11. //遍历src的每一个元素并拷贝
  12. //'\0'的ASCII码值为0
  13. //当*src为'\0'时循环条件为假,退出循环
  14. {
  15. ;
  16. }
  17. return p;
  18. }

三、strcat

1.库函数中的strcat

库函数中的strcat是字符拼接函数
strcat(arr1, arr2);
表示将arr2中的内容拼接到arr1后面并返回arr1的地址。

用法如下:

  1. int main()
  2. {
  3. char arr1[50] = "hello ";
  4. char arr2[] = "world";
  5. char* ret = strcat(arr1, arr2);
  6. printf("%s\n", ret);
  7. return 0;
  8. }

在这里插入图片描述

2.模拟实现strcat

char* my_strcat(char* dest, const char* src);
思路:先找到dest后字符串的’\0’,从该地址开始拷贝src后的字符串

代码如下(示例):

  1. char* my_strcat(char* dest, const char* src)
  2. {
  3. assert(dest && src);
  4. char* ret = dest;
  5. while (*dest)
  6. {
  7. dest++;
  8. }
  9. //此时dest是前一个字符串'\0'的位置
  10. //接下来拷贝src后的内容,与strcpy相同
  11. while (*dest++ = *src++)
  12. {
  13. ;
  14. }
  15. return ret;
  16. }

四、strcmp

1.库函数中的strcmp

strcmp(arr1, arr2);
从第一个字符起比较arr1和arr2的每一个字符的ASCII码值(注意不是比较arr1和arr2的长度),若大于返回大于0的值,小于返回小于0的值,等于返回0。

用法如下:

  1. int main()
  2. {
  3. int ret = strcmp("abq", "abcd");
  4. printf("%d\n", ret);
  5. return 0;
  6. }

在这里插入图片描述
注:当两个字符串不相同时,库中要求返回大于0、小于0的值,有些编译器将其固定为1和-1。

2.模拟实现strcmp

思路:遍历两个字符串的每一个元素,直到有不同的字符时停止

  1. int my_strcmp(const char* str1, const char* str2)
  2. //两个字符串都不应被修改,加const保护
  3. {
  4. assert(str1 && str2);
  5. while (*str1 == *str2)
  6. {
  7. if (*str1 == '\0')
  8. return 0;
  9. str1++;
  10. str2++;
  11. }
  12. return *str1 - *str2;
  13. //str1 > str2返回大于0的值
  14. //str1 < str2返回大于0的值
  15. }

感谢阅读,如有错误请批评指正

发表评论

表情:
评论列表 (有 0 条评论,453人围观)

还没有评论,来说两句吧...

相关阅读