有意思的字符串查函数strchr,strrchr,strstr,strrstr 通过⼀段时间对字符串的了解,我发现了许多有意思的
字符串函数,下⾯我们就以常见的字符串查函
数:strchr,strrchr,strstr,strrstr为例来模拟实现这些有意思的
字符串查函数吧!
【strchr】【strrchr】
查⼀个字符,有所不同的是:strchr⽤于查这个字符第⼀次出现的位置,strrchr⽤于查
这个字符最后⼀次出现的位置.下⾯我们就来打开MSDN来查这两个字符查函数的函数原
型:
char *strchr(const char *string,int c)
char *strrchr(const char *string,int c)
需要注意的是:这两个函数的第⼆个参数是⼀个整型值,但是它却包含了⼀个字符值,因
为字符在计算机内存中都是存储的是它的ASC||值,当定义为整形时反⽽提⾼了它的存储范围。
下⾯我们先给出程序的测试代码:
1. int main()
2. {
3. char ch=0;
4. char *ret=NULL;
5. char arr[]="feabadc";
6. printf("请输⼊⼀个你要查的字符:");
7. scanf("%c",&ch);
8. ret=my_strchr(arr,ch);
9. printf("%s\n",ret);
10. system("pause");
11. return 0;
12. }
对于strchr我们知道它是⼀个查⼀个字符第⼀次出现的函数,到后返回⼀个指向该位置的
指针,下⾯我们就来实现⼀个查字符的函数:strchr.
1. char *my_strchr(char *str,char ch)
2. {
3. assert(str);
4. while(*str != '\0')
5. {
6. if(*str == ch)
7. return str;
8. str++;
9. }
10. return 0;
11. }
下⾯我们就来验证这个函数:
我们发现对于字符串“feabadc”,a这个字符出现了两次,那仫如果我们⽤strchr来查字符a 返回的是第⼀个a和他之后的字符,但是如果我们⽤strrchr来查这个字符串呢?⼜会出现什仫结果?下⾯我们就来实现这个函数:strrchr
1. #define _CRT_SECURE_NO_WARNINGS
2. #include<stdio.h>
3. #include<stdlib.h>
4. #include<string.h>
5. #include<assert.h>
6.
7. char *my_strrchr(char *str,char ch)
8. {
9. char *ptr=NULL;
10. assert(str);
11. while(*str != '\0')
12. {
13. if(*str == ch)
14. ptr=str;
15. str++;
16. }
17. if(ptr != 0)
18. return ptr;
19. return 0;
20. }
21.
22. int main()
23. {
24. char ch=0;
25. char *ret=NULL;
26. char arr[]="feabadc";
27. printf("请输⼊⼀个你要查的字符:");
28. scanf("%c",&ch);
29. ret=my_strrchr(arr,ch);
30. printf("%s\n",ret);
31. system("pause");
32. return 0;
33. }
那仫这个函数的结果⼜是什仫呢?请继续向下看
看对于同⼀个字符串"feabadc",我们使⽤不同的查函数查其中的字符‘a’我们得到了不⼀样的结果。看到这⾥我们是不是对strchr和strrchr有了更加深⼊的了解呢?那是肯定的啦!如果我们查的是⼀个⼦串呢?下⾯我们就来看另⼀组字符串查函数:strstr,strrstr.【strstr】【strrstr】
在字符串中查⼦串,我们可以使⽤strstr,它的函数原型为:
char *strstr(const char *s1,const char *s2)
和上⾯类似,strstr虽然是⽤来查⼦串的但是它是在s1中查第⼀次出现s2的起始位置,并返回⼀个指向该位置的指针,下⾯我们就来实现这个函数strstr.
1. #include<stdio.h>
2. #include<stdlib.h>
3. #include<string.h>
4. #include<assert.h>
5.
6. char *my_strstr(char *dest,char *src)
7. {
8. char *ptr=NULL;
9. char *str1=dest;
10. char *str2=src;
11. assert(dest);
12. assert(dest);
13. while(*str1 != '\0')
14. {
15. ptr=str1;
16. while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
17. {
18. str1++;
19. str2++;
20. }
21. if(*str2 == '\0')
22. return (char *)ptr;
23. str1=ptr+1;
24. str2=src;
25. }
26. return 0;
字符串函数str27. }
28.
29. int main()
30. {
31. char *ret=NULL;
32. char arr1[]="i love you forever";
33. char *arr2="ve";
34. ret=my_strrstr(arr1,arr2);
35. printf("%s\n",ret);
36. system("pause");
37. return 0;
38. }
它的结果如下:
对于字符串"i love you forever"它⾥⾯存在两个⼦串"ve",⽽我们使⽤strstr函数之后返回的是第⼀个"ve"出现的指针位置,类似上述strchr和strrchr是不是也存在⼀个strrstr函数可以查第⼆次出现've'的位置呢?但是打开MSDN后库⾥却没有这个函数,是不是这个函数我们就不能使⽤呢?下⾯我们就来实
现这个查第⼆次出现⼦串的函数。
⽅法⼀:⾃定义实现strrstr
1. #include<stdio.h>
2. #include<stdlib.h>
3. #include<string.h>
4. #include<assert.h>
5.
6. // i love you fore ver ve
7. char *my_strrstr(char *dest,char *src)
8. {
9. char *first=NULL;
10. char *second=NULL;
11. char *str1=dest;
12. char *str2=src;
13. assert(dest);
14. assert(src);
15. while((*str1 != '\0'))
16. {
17. first=str1; //记录下⼀次⽐较的起始位置
18. while((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
19. {
20. str1++;
21. str2++;
22. }
23. if(*str2 == '\0')
24. second=first; //从第⼀次查到⼦串的位置后继续查
25. str1=first+1;
26. str2=src;
27. }
28. if(*str1 == '\0')
29. return second;
30. return 0;
31. }
32. int main()
33. {
34. char *ret=NULL;
35. char arr1[]="i love you forever";
36. char *arr2="ve";
37. ret=my_strrstr(arr1,arr2);
38. printf("%s\n",ret);
39. system("pause");
40. return 0;
41. }
⽅法⼆:通过调⽤strstr来实现strrstr,测试函数同⽅法⼀
1. char *my_strrstr(const char *dest,const char *src)
2. {
3. const char *ret=NULL;
4. const char *last=NULL;
5. assert(dest);
6. assert(src);
7. if(*src == '\0')
8. return (char *)dest;
9. while(ret=my_strstr(dest,src))
10. {
11. last=ret;
12. dest=ret+1;
13. }
14. return (char *)last;
15. }
那仫这个特殊的函数strrstr它的结果是不是我们预想的呢?当然啦!下⾯我们就来运⾏⼀下它:
我们发现确实和我们开始预想的⼀样,神奇的strrstr 果然没有辜负我们的厚望,通过模拟实现⼀些字符串的库函数,可以让我们更好的了解字符串库函数的实现,当然字符串还有许多功能强⼤的库函数有待⼤家⾃⼰⽤MSDN了解和使⽤,以上就是我个⼈对字符串查库函数的⼀些理解,⽐较粗糙希望⼤家多多理解啦!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论