【 C 】字符串查找基础笔记

举报
李锐博恩 发表于 2021/07/15 08:01:25 2021/07/15
【摘要】 目录 查找一个字符 查找任何几个字符 查找一个字串 strrstr的自定义编写实践 strrpbrk的自定义编写实践 标准库中有很多函数,它们用各种不同的方法查找字符串。下面分别介绍: 先介绍标准库中有的,之后再扩展标准库中没有的。 查找一个字符 在一个字符串中查找一个特定字符分为两种情况:第一是查找特定字符第一次出现的字符,第二种是查找特定字符最后一次出...

目录

查找一个字符

查找任何几个字符

查找一个字串

strrstr的自定义编写实践

strrpbrk的自定义编写实践


标准库中有很多函数,它们用各种不同的方法查找字符串。下面分别介绍:

先介绍标准库中有的,之后再扩展标准库中没有的。

查找一个字符

在一个字符串中查找一个特定字符分为两种情况:第一是查找特定字符第一次出现的字符,第二种是查找特定字符最后一次出现的字符。

分别对应的函数是:strchr 和 strrchr函数,它们的原型如下:

char *strchr( char const *str, int ch );

char *strrchr( char const *str, int ch);

注意第2个参数是一个整型值。(每个字符都会对应一个ASCII码,ASCII码是一个整形数值。)

strchr在字符串str中查找字符ch第1次出现的位置,找到后函数返回一个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回一个NULL指针。strrchr函数名和strchr相比,多了一个字母r,代表“right”,也就是它返回的是一个指向字符串中该字符最后一次出现的位置(最右边那个),后面的函数出现r时,意义都是这样。

举个例子:

char string[20] = "Hello there, honey.";

char *ans;

ans = strchr( string, 'h' );

ans所指向的位置将是 string + 7,因为第1个'h'出现在这个位置。注意这里大小写是有区别的。

查找任何几个字符

strpbrk是个更为常见的函数。它并不是查找某个特定的字符,而是查找任何一组字符第1次在字符串中出现的位置。它的原型如下:

char *strpbrk( char const *str, char const *group );

这个函数返回一个指向str中第1个匹配group中任何一个字符的字符位置。如果未找到匹配,函数返回一个NULL指针。

在下面的代码段中,

char string[20] = "Hello there, honey.";

char *ans;

ans = strpbrk( string, "aeiou" );

ans所指向的位置是string + 1,因为这个位置是第2个参数中的字符第一次出现的位置。

查找一个字串

为了在字符串中查找一个字串,我们可以使用strstr函数,它的原型如下:

char *strstr( char const *s1, char const *s2 );

这个函数在s1中查找整个s2第一次出现的位置,并返回一个指向该位置的指针。如果s2没有完整地出现在s1的任何地方,函数将返回一个NULL指针。如果第二个参数是一个空字符串,就返回s1.

strrstr的自定义编写实践

注意,标准库中并不存在strrstr或strrpbrk函数。不过,如果你需要它们,它们可以很容易实现。下面给出一个实现strrstr的方法:

查找字串最右一次出现的位置:


  
  1. //在字符串s1中查找字符串s2最右出现的位置,并返回一个指向该位置的指针
  2. #include<string.h>
  3. char * my_strrstr(char const *s1, char const *s2)
  4. {
  5. register char *last;
  6. register char *current;
  7. last = NULL;
  8. //只有第2个字符串不为空时才进行查找,如果s2为空,则返回NULL
  9. if(*s2 != '\0')
  10. {
  11. //查找s2在s1中的位置
  12. current = strstr( s1, s2 );
  13. //我们每次找到字符串时,让指针指向它的起始位置,然后查找该字符串下一个匹配位置
  14. while(current != NULL)
  15. {
  16. last = current;
  17. current = strstr(last + 1, s2); //从上次查找到的匹配字符串的位置继续开始继续查找
  18. }
  19. }
  20. //返回指向我们找到的最后一次匹配的起始位置的指针
  21. return last;
  22. }

strrpbrk的自定义编写实践

下面我们继续编写一个strrpbrk的程序,查找任何几个字符在字符串中最后出现的位置:


  
  1. //在字符串s1中查找字符组中最右出现的位置,并返回一个指向该位置的指针
  2. #include <string.h>
  3. char * my_strrpbrk(char const *str, char const *group)
  4. {
  5. register char *last;
  6. register char *current;
  7. last = NULL;
  8. //只有第2个group不为空时才进行查找,如果s2为空,则返回NULL
  9. if(*group != '\0')
  10. {
  11. //查找group中字符在str中的位置
  12. current = strpbrk( str, group );
  13. //我们每次找到匹配字符时,让指针指向它的起始位置,然后查找该字符下一个匹配位置
  14. while(current != NULL)
  15. {
  16. last = current;
  17. current = strpbrk(last + 1, group); //从上次查找到的匹配字符的位置继续开始继续查找
  18. }
  19. }
  20. //返回指向我们找到的最后一次匹配的起始位置的指针
  21. return last;
  22. }

是不是和上面的那个很相似呢?确实如此!

只是改好了还不够有说服力,那就实际应用下看看,结果是否如意:


  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. char *my_string = "Soul Da, how is everything going?"; //在这个字符串中查找目标字符
  7. char *aim_string = "aeiou"; //需要查找的字符
  8. char *p; //用来接收函数返回的指针
  9. //函数原型
  10. char *my_strrpbrk(char const *str, char const *group);
  11. //调用函数
  12. p = my_strrpbrk(my_string, aim_string);
  13. printf("%s\n", p);
  14. return 0;
  15. }
  16. //定义函数my_strrbprk
  17. char *my_strrpbrk(char const *str, char const *group)
  18. {
  19. register char *last;
  20. register char *current;
  21. last = NULL;
  22. //只有第2个group不为空时才进行查找,如果s2为空,则返回NULL
  23. if(*group != '\0')
  24. {
  25. //查找group中字符在str中的位置
  26. current = strpbrk( str, group );
  27. //我们每次找到匹配字符时,让指针指向它的起始位置,然后查找该字符下一个匹配位置
  28. while(current != NULL)
  29. {
  30. last = current;
  31. current = strpbrk(last + 1, group); //从上次查找到的匹配字符的位置继续开始继续查找
  32. }
  33. }
  34. //返回指向我们找到的最后一次匹配的起始位置的指针
  35. return last;
  36. }

在codeblock中运行的结果为:

和预想的一样。

最后我提醒一下,这个程序在C++中竟然运行不出来,老是报错,并不是头文件的问题,头文件我也添加了C++中需要的。不管了,等到开始C++学习后再试试哪里出问题了。

还要提醒一点呢?就是函数的名字比较难记,别写错了,例如strpbrk写成了strbprk,因为这个问题我也是很郁闷,最后才发现我拼写出问题了。哈哈,可能是菜吧!

 

 

 

 

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/82558299

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。