当前位置:   article > 正文

C语言——字符串函数及模拟实现strlen、strcpy、strcat、strcmp_c语言switch实现strlen,strcmp,strcat,strcpy封装一个文件

c语言switch实现strlen,strcmp,strcat,strcpy封装一个文件

一、模拟实现strlen

1、字符串数组

        C语言中是没有字符串这种类型,而我们通常叫字符串数组、它其实是连续的字符序列,最后以空字符'\0'作为终止符,一个字符串的长度就是所有字符的数量,但不包括终止符'\0'

  1. // 模拟实现strlen()函数 size_t strlen(const char * str) size_t 表示 unsigned int
  2. 1.计数器版本
  3. int my_strlen(char * str)
  4. {
  5. int count = 0;
  6. while (*str != '\0')
  7. {
  8. count++;
  9. str++;
  10. }
  11. return count;
  12. }
  13. 2.递归版本
  14. int my_strlen1(char* str)
  15. {
  16. if (*str != '\0')
  17. {
  18. return 1 + my_strlen1(str + 1);
  19. }
  20. else
  21. {
  22. return 0;
  23. }
  24. }
  25. 3.指针—指针
  26. int my_strlen2(char* str)
  27. {
  28. char *endstr = str;
  29. while (*str != '\0')
  30. {
  31. str++;
  32. }
  33. return str - str[0];
  34. }
  35. int main()
  36. {
  37. char str[] = "abcde";
  38. int num = 0;
  39. int num1 = 0;
  40. int num2 = 0;
  41. num = my_strlen(str);
  42. num1 = my_strlen1(str);
  43. num2 = my_strlen2(str);
  44. printf("%d\n", num); // 5
  45. printf("%d\n", num1); // 5
  46. printf("%d\n", num2); // 5
  47. return 0;
  48. }

递归方法

bcc3b8f0f1d04432b16ca47b844e2a0e.png

 二、模拟实现strcpy

将arr1复制到arr2

  1. // char * strcpy(char * destination, const char* source)
  2. my_strcpy(char*arr1, const char*arr2)
  3. {
  4. 断言
  5. assert(arr2 != NULL);
  6. while (*arr1 = *arr2)//( *arr1++ = *arr2++)
  7. {
  8. arr1++;
  9. arr2++;
  10. }
  11. }
  12. int main()
  13. {
  14. char arr1[] = "abcdef";
  15. char arr2[10] = {0};
  16. strcpy(arr1, arr2);
  17. my_strcpy(arr1, arr2);
  18. printf("%s", arr2);
  19. return 0;
  20. }

三、模拟实现strcat和strncat

strcat(char * destination, const char* source)  字符串拼接,将str2的字符全部拼接到str1中

strncat(char * destination, const char* source,int count) 指定数量的字符拼接到arr1中

87652842b0ce4e57ade529e06b3dd6f5.png

  1. // char * strcat(char * destination, const char* source)
  2. void my_strcat(char*str1, const char*str2)
  3. {
  4. assert(str1 && str2);
  5. while (*str1)
  6. {
  7. str++;
  8. }
  9. while ((*str1 = *str2) != '\0')
  10. {
  11. str1++;
  12. str2++;
  13. }
  14. }
  15. mystrncat(char* str1, char* str2, size_t count)
  16. {
  17. while (*str1++) // 让指针指向 \0
  18. {
  19. ;
  20. }
  21. str1--; // 让指针指向 \0 前一个字符
  22. while (count--)
  23. {
  24. if ((*str1++ = *str2++) == 0)
  25. {
  26. return (str1);
  27. }
  28. }
  29. // 当str2指定的几个字符不包括\0 例如 "abcd" 只追加3个字符 abc
  30. // 也就是说str2没追加到'\0',自动补'\0'
  31. *str1 = '\0';
  32. return (str1);
  33. }
  34. int main()
  35. {
  36. char str1[20] = "hello ";
  37. char str2[] = "world";
  38. //my_strcat(str1, str2);
  39. mystrncat(str1, str2, 3);
  40. printf("%s", str1);
  41. return 0;
  42. }

 

 三、模拟实现strcmp

eff7d8b5fff1491a8f27df83d7fc6051.png

 

  1. // int strcmp(const char * str1, const char * str2)
  2. // return arr1 < arr2 返回 -1 比较第一个字符
  3. // return arr1 > arr2 返回 1
  4. // return arr1 = arr2 返回 0
  5. int my_strcmp(char* str1, char* str2)
  6. {
  7. while (*str1 == *str2)
  8. {
  9. if (*str1 == '\0')
  10. {
  11. return 0;
  12. }
  13. str1++;
  14. str2++;
  15. }
  16. if (*str1 > *str2)
  17. {
  18. return 1;
  19. }
  20. else {
  21. return -1;
  22. }
  23. return 0;
  24. }
  25. sys_strcmp(const char*str1, const char*str2)
  26. {
  27. int ret = 0;
  28. while ((ret = *(unsigned char* )str1 - *(unsigned char* )str2) == 0 && *str2) // ret 为正数 str1 > str2
  29. { // 满足 *str1 - *str2 = 0 字符相等, *str2 不等于'\0'
  30. ++str1,++str2;
  31. }
  32. return ((-ret) < 1 )-(ret < 1); // -ret < 0 如果ret 为正数 -ret 为负数 则 -ret < 0 为 真 即为 1
  33. }
  34. int main()
  35. {
  36. char str[] = "abcdc";
  37. char str2[] = "abcdc6d";
  38. //int a = my_strcmp(str, str2);
  39. int b = strcmp(str, str2);
  40. int c = sys_strcmp(str, str2);
  41. //printf("%d\n", a);
  42. //printf("%d\n", b);
  43. printf("%d\n", c);
  44. return 0;
  45. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号