当前位置:   article > 正文

C语言——Str——类型函数“大串烧”_c语言str类函数

c语言str类函数

首先,Str类型函数主要包括strlen,strcpy,strcat,strcmp,strstr,strtok,sterror等,本次小编将给大家介绍这些函数的用法和模拟实现。 

注意:这些函数的实现都必须包含库函数#include<string.h>

(一).strlen的使用和模拟实现

作用:求字符串长度

类型:size_t strlen ( const char * str );

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。

 参数指向的字符串必须要以 '\0' 结束。

 注意函数的返回值为size_t,是⽆符号的( 易错 )

使用:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. char str[100] = "abcde";
  6. int ret = strlen(str);
  7. printf("%d", ret);
  8. return 0;
  9. }

这里我们就可以求出str的长度是6,

它的模拟实现的方式有三种:

方法一:计数器实现

  1. #include<stdio.h>
  2. #include<string.h>
  3. int my_strlen(const char* str)
  4. {
  5. assert(str);
  6. int count = 0;
  7. while (*str)
  8. {
  9. count++;
  10. str++;
  11. }
  12. return count;
  13. }
  14. int main()
  15. {
  16. char str[] = "abcdefgh";
  17. int ret = my_strlen(str);
  18. printf("%d", ret);
  19. return 0;
  20. }

方法2:递归

  1. #include<stdio.h>
  2. #include<string.h>
  3. int my_strlen(const char* str)
  4. {
  5. assert(str);
  6. if (*str == '\0')
  7. return 0;
  8. else
  9. return 1 + my_strlen(str + 1);
  10. }
  11. int main()
  12. {
  13. char str[] = "abcdefgh";
  14. int ret = my_strlen(str);
  15. printf("%d", ret);
  16. return 0;
  17. }

方法三:指针-指针

  1. #include<stdio.h>
  2. #include<string.h>
  3. int my_strlen(const char* str)
  4. {
  5. assert(str);
  6. char* p = str;
  7. if (*p != '\0')
  8. {
  9. p++;
  10. }
  11. return p - str;
  12. }
  13. int main()
  14. {
  15. char str[] = "abcdefgh";
  16. int ret = my_strlen(str);
  17. printf("%d", ret);
  18. return 0;
  19. }

总结:strlen函数实现的思路就是计算字符串的长度遇到‘\0’就结束。

(二).strcpy的使用和模拟实现

作用:拷贝字符串

类型:char* strcpy(char * destination, const char * source );

注意:

1.源字符串必须以 '\0' 结束。

2.会将源字符串中的 '\0' 拷⻉到⽬标空间。

3.⽬标空间必须⾜够⼤,以确保能存放源字符串。

4.⽬标空间必须可修改。

使用:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include<assert.h>
  4. int main()
  5. {
  6. char arr1[20] = { 0 };
  7. char arr2[] = "adsahgsdjfn";
  8. strcpy(arr1, arr2);
  9. printf("%s\n%s",arr1,arr2);
  10. return 0;
  11. }

模拟实现:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<assert.h>
  4. char* my_strcpy(char* dest, const char* src)
  5. {
  6. char* ret = dest;
  7. assert(dest != NULL);
  8. assert(src != NULL);
  9. while ((*dest++ = *src++))
  10. {
  11. ;
  12. }
  13. return ret;
  14. }
  15. int main()
  16. {
  17. char arr1[20] = { 0 };
  18. char arr2[] = "abcdefgh";
  19. char* ret=my_strcpy(arr1, arr2);
  20. printf("%s", ret);
  21. return 0;
  22. }

总结:strcpy主要是用来拷贝字符串。

(三).strcat的使用和模拟实现

作用:用来连接字符串

类型:char *my_strcat(char *dest, const char*src)

注意:

1.源字符串必须以 '\0' 结束。

2.⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

4.⽬标空间必须可修改。

使用:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. char arr1[100] = "abffd";
  6. char arr2[] = "mnghty";
  7. strcat(arr1, arr2);
  8. printf("%s\n", arr1);
  9. return 0;
  10. }

模拟实现:

  1. 模拟实现
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<assert.h>
  5. char* my_strcat(char* dest, const char* src)
  6. {
  7. char* ret = dest;
  8. assert(dest != NULL);
  9. assert(src != NULL);
  10. while (*dest)
  11. {
  12. dest++;
  13. }
  14. while ((*dest++ = *src++))
  15. {
  16. ;
  17. }
  18. return ret;
  19. }
  20. int main()
  21. {
  22. char arr1[100] = "abhuoeu";
  23. char arr2[] = "ghuiol";
  24. char *ret = my_strcat(arr1, arr2);
  25. printf("%s\n", ret);
  26. return 0;
  27. }

总结:strcat函数主要用于字符串连接。

(四).strcmp函数的使用和模拟实现

作用:用于比较两个字符串内容。

注意:

1.第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦

2.第⼀个字符串等于第⼆个字符串,则返回0

3.第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

4.那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

实现:

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. char arr1[] = "abbbc";
  6. char arr2[] = "bcdfgh";
  7. int ret=strcmp(arr1, arr2);
  8. printf("%d", ret);
  9. return 0;
  10. }

模拟实现:

  1. #include<assert.h>
  2. int my_strcmp(const char* str1, const char* str2)
  3. {
  4. assert(*str1 != NULL);
  5. assert(*str2 != NULL);
  6. while (*str1 == *str2)
  7. {
  8. if (str1 == '\0')
  9. return 0;
  10. str1++;
  11. str2++;
  12. }
  13. return *str1 - *str2;
  14. }
  15. int main()
  16. {
  17. char arr1[] = "abbbcd";
  18. char arr2[] = "abbdfg";
  19. int ret=my_strcmp(arr1, arr2);
  20. printf("%d\n", ret);
  21. return 0;
  22. }

总结:strcmp主要用于对字符串的大小比较。

(五).strncpy,strncat,strncmp的使用

注意strncpy,strncat,strncmp这几个函数是strcpy,strcat,strcmp的升级版,那他们的作用是什么呢?

strncpy:char * strncpy ( char * destination, const char * source, size_t num );

strncat:char * strncat ( char * destination, const char * source, size_t num );

strncmp:int strncmp ( const char * str1, const char * str2, size_t num );

通过与上面的函数比较这里的类型是不是都多了个size_t num啊!

没错,这三个函数是在原有的基础上多了数量的限制,(拷贝,连接,比较)它们都有了明确的数量要求,这使得程序运行时更加安全。

(六).strstr的使用和模拟实现

作用:在一个字符串中查找另一个字符串是否存在。

类型:char * strstr ( const char * str1, const char * str2);

使用:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<assert.h>
  4. int main()
  5. {
  6. char str1[] = "my name is he";
  7. char str2[] = "name";
  8. char* p = strstr(str1, str2);
  9. printf("%s", p);
  10. return 0;
  11. }

模拟实现:

  1. #include<stdio.h>
  2. #include<string.h>
  3. char * my_strstr (const char * str1, const char * str2)
  4. {
  5. char *cp = (char *) str1;
  6. char *s1, *s2;
  7. if ( !*str2 )
  8. return((char *)str1);
  9. while (*cp)
  10. {
  11. s1 = cp;
  12. s2 = (char *) str2;
  13. while ( *s1 && *s2 && !(*s1-*s2) )
  14. s1++, s2++;
  15. if (!*s2)
  16. return(cp);
  17. cp++;
  18. }
  19. return(NULL);
  20. }
  21. int main()
  22. {
  23. char str1[] = "my name is he";
  24. char str2[] = "name";
  25. char* p = my_strstr(str1, str2);
  26. printf("%s", p);
  27. return 0;
  28. }

总结:本函数模拟实现需要我们打开思路,要进行画图实践更容易想到大家如有兴趣可以实践一下,也可以私信我讨论哦!

(七).strtok的使用

作用:分割字符串

类型:char * strtok ( char * str, const char * sep);

注意:

1.sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合

2. 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标 记。

3. strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容 并且可修改。)

4.strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串 中的位置。

5.strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标 记。

6.如果字符串中不存在更多的标记,则返回 NULL 指针。 

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. char arr[] = "192.168.6.111";
  6. char* sep = ".";
  7. char* str = NULL;
  8. for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
  9. {
  10. printf("%s\n", str);
  11. }
  12. return 0;
  13. }

(八).strerror函数的使用

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

类型:char * strerror ( int errnum );

使用:

  1. #include <errno.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6. int i = 0;
  7. for (i = 0; i <= 10; i++) {
  8. printf("%s\n", strerror(i));
  9. }
  10. return 0;
  11. }

好了,以上就是str系列函数了,大家掌握好它们各自的用法就行了,对于模拟实现就能加深我们的印象。

觉得小编写的还不错的话一键三连将是对小编最大的支持!谢谢大家!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/924596
推荐阅读
相关标签
  

闽ICP备14008679号