有意思的字符串查函数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小时内删除。