赞
踩
首先,Str类型函数主要包括strlen,strcpy,strcat,strcmp,strstr,strtok,sterror等,本次小编将给大家介绍这些函数的用法和模拟实现。
注意:这些函数的实现都必须包含库函数#include<string.h>
作用:求字符串长度
类型:size_t strlen ( const char * str );
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为size_t,是⽆符号的( 易错 )
使用:
- #include <stdio.h>
- #include <string.h>
-
-
- int main()
- {
- char str[100] = "abcde";
- int ret = strlen(str);
- printf("%d", ret);
- return 0;
- }
这里我们就可以求出str的长度是6,
它的模拟实现的方式有三种:
方法一:计数器实现
- #include<stdio.h>
- #include<string.h>
-
- int my_strlen(const char* str)
- {
- assert(str);
- int count = 0;
- while (*str)
- {
- count++;
- str++;
- }
- return count;
- }
- int main()
- {
-
- char str[] = "abcdefgh";
- int ret = my_strlen(str);
- printf("%d", ret);
- return 0;
- }
方法2:递归
- #include<stdio.h>
- #include<string.h>
- int my_strlen(const char* str)
- {
- assert(str);
- if (*str == '\0')
- return 0;
- else
- return 1 + my_strlen(str + 1);
- }
- int main()
- {
-
- char str[] = "abcdefgh";
- int ret = my_strlen(str);
- printf("%d", ret);
- return 0;
- }
方法三:指针-指针
- #include<stdio.h>
- #include<string.h>
-
- int my_strlen(const char* str)
- {
- assert(str);
- char* p = str;
- if (*p != '\0')
- {
- p++;
- }
- return p - str;
- }
-
-
- int main()
- {
-
- char str[] = "abcdefgh";
- int ret = my_strlen(str);
- printf("%d", ret);
- return 0;
- }
总结:strlen函数实现的思路就是计算字符串的长度遇到‘\0’就结束。
作用:拷贝字符串
类型:char* strcpy(char * destination, const char * source );
注意:
1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷⻉到⽬标空间。
3.⽬标空间必须⾜够⼤,以确保能存放源字符串。
4.⽬标空间必须可修改。
使用:
- #include <stdio.h>
- #include <string.h>
- #include<assert.h>
- int main()
- {
-
- char arr1[20] = { 0 };
- char arr2[] = "adsahgsdjfn";
- strcpy(arr1, arr2);
- printf("%s\n%s",arr1,arr2);
- return 0;
- }
模拟实现:
- #include<stdio.h>
- #include<string.h>
- #include<assert.h>
-
- char* my_strcpy(char* dest, const char* src)
- {
- char* ret = dest;
- assert(dest != NULL);
- assert(src != NULL);
- while ((*dest++ = *src++))
- {
- ;
- }
- return ret;
- }
-
- int main()
- {
- char arr1[20] = { 0 };
- char arr2[] = "abcdefgh";
- char* ret=my_strcpy(arr1, arr2);
- printf("%s", ret);
- return 0;
- }
总结:strcpy主要是用来拷贝字符串。
作用:用来连接字符串
类型:char *my_strcat(char *dest, const char*src)
注意:
1.源字符串必须以 '\0' 结束。
2.⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改。
使用:
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char arr1[100] = "abffd";
- char arr2[] = "mnghty";
- strcat(arr1, arr2);
- printf("%s\n", arr1);
- return 0;
- }
模拟实现:
- 模拟实现
- #include<stdio.h>
- #include<string.h>
- #include<assert.h>
-
- char* my_strcat(char* dest, const char* src)
- {
- char* ret = dest;
- assert(dest != NULL);
- assert(src != NULL);
- while (*dest)
- {
- dest++;
- }
- while ((*dest++ = *src++))
- {
- ;
- }
- return ret;
- }
- int main()
- {
- char arr1[100] = "abhuoeu";
- char arr2[] = "ghuiol";
- char *ret = my_strcat(arr1, arr2);
- printf("%s\n", ret);
- return 0;
- }
总结:strcat函数主要用于字符串连接。
作用:用于比较两个字符串内容。
注意:
1.第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦
2.第⼀个字符串等于第⼆个字符串,则返回0
3.第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
4.那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。
实现:
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char arr1[] = "abbbc";
- char arr2[] = "bcdfgh";
- int ret=strcmp(arr1, arr2);
- printf("%d", ret);
- return 0;
- }
模拟实现:
- #include<assert.h>
-
- int my_strcmp(const char* str1, const char* str2)
- {
- assert(*str1 != NULL);
- assert(*str2 != NULL);
- while (*str1 == *str2)
- {
- if (str1 == '\0')
- return 0;
- str1++;
- str2++;
- }
- return *str1 - *str2;
- }
-
- int main()
- {
- char arr1[] = "abbbcd";
- char arr2[] = "abbdfg";
- int ret=my_strcmp(arr1, arr2);
- printf("%d\n", ret);
- return 0;
- }
总结:strcmp主要用于对字符串的大小比较。
注意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啊!
没错,这三个函数是在原有的基础上多了数量的限制,(拷贝,连接,比较)它们都有了明确的数量要求,这使得程序运行时更加安全。
作用:在一个字符串中查找另一个字符串是否存在。
类型:char * strstr ( const char * str1, const char * str2);
使用:
- #include<stdio.h>
- #include<string.h>
- #include<assert.h>
- int main()
- {
- char str1[] = "my name is he";
- char str2[] = "name";
- char* p = strstr(str1, str2);
- printf("%s", p);
- return 0;
- }
模拟实现:
- #include<stdio.h>
- #include<string.h>
-
- char * my_strstr (const char * str1, const char * str2)
- {
- char *cp = (char *) str1;
- char *s1, *s2;
- if ( !*str2 )
- return((char *)str1);
- while (*cp)
- {
- s1 = cp;
- s2 = (char *) str2;
- while ( *s1 && *s2 && !(*s1-*s2) )
- s1++, s2++;
- if (!*s2)
- return(cp);
- cp++;
- }
- return(NULL);
- }
- int main()
- {
- char str1[] = "my name is he";
- char str2[] = "name";
- char* p = my_strstr(str1, str2);
- printf("%s", p);
- return 0;
- }
总结:本函数模拟实现需要我们打开思路,要进行画图实践更容易想到大家如有兴趣可以实践一下,也可以私信我讨论哦!
作用:分割字符串
类型: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 指针。
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- char arr[] = "192.168.6.111";
- char* sep = ".";
- char* str = NULL;
- for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
- {
- printf("%s\n", str);
- }
- return 0;
- }
作用:strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
类型:char * strerror ( int errnum );
使用:
- #include <errno.h>
- #include <string.h>
- #include <stdio.h>
-
- int main()
- {
- int i = 0;
- for (i = 0; i <= 10; i++) {
- printf("%s\n", strerror(i));
- }
- return 0;
- }
好了,以上就是str系列函数了,大家掌握好它们各自的用法就行了,对于模拟实现就能加深我们的印象。
觉得小编写的还不错的话一键三连将是对小编最大的支持!谢谢大家!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。