一起talk C栗子吧(第六十三回:C语言实例--字符串查找)

标签: strstr strchr strrch
1504人阅读 评论(0) 收藏 举报
分类:

各位看官们,大家好,上一回中咱们说的是字符串比较的例子,这一回咱们说的例子是:字符串查找。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,在C语言的标准库中为我们提供了字符串查找函数,我们只需要包含string.h头文件就可以使用字符串查找函数。这点和字符串比较函数一样,标准库为我们提供了三个字符串查找函数:strchr,strrchr和strstr。当然了,标准库中也有一些类似查找功能的函数,但是这些函数的使用概率比较小,因此我们就不详细介绍了。接下来我们分别介绍查找函数的用法及其注意事项。

strchr函数

  • strchr函数原型:char * strchr(const char *s1, int c)
  • strchr函数用法:它把c转换成char类型的字符,然后在s1中查找该字符,如果找到该字符,那么返回该字符在字符串中第一次出现的位置,如果没有找到,那么返回空指针。
  • strchr注意事项:它把int类型的变量强制转换成char类型的变量,其实是按照字符的ASCII码值进行转换。比如97会被转换为字符’a’。我们想查找某个字符时,只需要输入它的ASCII码值就可以。另外,在查找过程中,字符串的小尾巴也会当作字符串的一部分,所以可以在字符串中找到空字符的位置。

我们举一个实际的例子来说明,在程序中定义如下字符串:

char *s1 = "abcdABCDabcd";
char *s2 = "abc";
int c = 97;

我们使用strchr函数来查找c在字符串s1中的位置,查找的结果如下:

a(97) is found in abcdABCDabcd, and location is 1. 
(0) is found in abcdABCDabcd, and location is 13.  //" \0 can't be show"

这里的字符串比较简单,大家一眼就可以看出来字符a在字符串s1中,而且位于第一位。我们再和程序的运行结果去对比,显然是一致的。另外,也可以在字符串中查找空字符,也就是字符串的小尾巴,查找的结果位于字符串末尾,这点我们可以在上面的程序运行结果中看到。

strrchr函数

  • strrchr函数原型:char * strrchr(const char *s1, int c)
  • strrchr函数用法:它把c转换成char类型的字符,然后在s1中查找该字符,如果找到该字符,那么返回该字符在字符串中最后一次出现的位置,如果没有找到,那么返回空指针。这点和strchr正好相反。
  • strrchr注意事项:它和strchr的注意事项相同,因此就不详细说明了。

我们举一个实际的例子来说明,还是使用刚才的字符串:

char *s1 = "abcdABCDabcd";
char *s2 = "abc";
int c = 97;

我们使用strrchr函数来查找c在字符串s1中的位置,查找的结果如下:

a(97) is found in abcdABCDabcd, and re-location is 9. 
(0) is found in abcdABCDabcd, and re-location is 13. //" \0 can't be show"

大家可以看到,字符串s1中包含两个a字符,一个位于字符串的第一位,另外一个位于字符串的第九位。这和程序的运行结果是一致的。另外,字符串s1中只有一个空字符,而且位于字符串的末尾,我们再和程序的运行结果去对比,这显然也是一致的。

大家或许已经发现了,我们刚才使用的两个字符串查找函数,都是用来查找单个字符的,有没有查找整个字符串的函数?答案是肯定的。标准库为我们提供了strstr函数,接下来我们详细介绍它。

strstr函数

  • strstr函数原型:char * strstr(const char *s1, const char *s2)
  • strstr函数用法:它用来查找字符串s2在字符串s1中的位置。如果在s1中找到s2,那么返回s2在s1中第一次出现的位置,如果没有找到,那么返回空指针。这点和strchr一样。
  • strstr注意事项:在查找过程中它不会把字符串s2中的小尾巴当作s2的一部分,因此只查找s2中的非空字符在字符串s1的位置。如果字符串s2是一个空字符串,那么返回指向s1的指针,这点比较特殊。

我们举一个实际的例子来说明,还是使用刚才的字符串,只是修改一下s2的值:

char *s1 = "abcdABCDabcd";
char *s2 = "ABC";

我们 使用strstr查找字符串,其中还对空字符串进行了测试,程序的运行结果如下:

ABC is found in abcdABCDabcd, and location is 5
is not found in abcdABCDabcd. // " empty string can't be show "

参与查找的两个字符串都比较简单,我们可以看到字符串ABC确实是在字符串abcdABCDabcd中,而且它位于第五位。这显然和程序的运行结果一致。

在最后,我们对标准库提供的字符串查找函数做一个总结:

  • 函数strchr和strrchr的用法一样,只是它们的返回值不同,strchr返回字符位于字符串中的初始位置。 strrch返回字符位于字符串中的末端位置。打个比喻:strchr查找到的是一个“先锋官”,strrch查找到 的是一个“压阵官”。
  • 函数strstr有点类似strchr,它查找到的也是一个“先锋官”,不过它比strchr功能强,strchr只能在字符串中查找一个字符,strstr可以在一个字符串中查找另外一个字符串。有一点需要注意的是,如果在某个字符串中查找空字符串时,它返回的指针指向原来的字符串。这点是比较特殊的地方。
  • 这三个字符串查找函数,虽然各为其政,但是也有达成统一战线的时候,那就是:如果在字符串中查找不到字符或者字符串,那么它们都返回一个空指针。

看官们,正文中就不写代码了,详细的代码放到了我的资源中。代码中整理了所有的例子,而且有详细的注释,大家可以点击这里下载使用。

各位看官,关于字符串查找的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。


查看评论

C例子:字符串查找函数

  • 2015年11月18日 22:40
  • 2KB
  • 下载

一起talk C栗子吧(第一百零六回:C语言实例--生产者与消费者问题二)

各位看官们,大家好,上一回中咱们说的是生产者与消费者问题的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起talk C栗子吧!...
  • talk_8
  • talk_8
  • 2016-01-18 21:34:19
  • 1354

一起talk C栗子吧(第五十回:C语言实例--最小生成树二)

使用克鲁斯卡尔(Kruskal)算法生成最小生成树
  • talk_8
  • talk_8
  • 2015-10-02 11:48:01
  • 622

C例子:DIY字符串查找函数

  • 2015年11月30日 22:24
  • 3KB
  • 下载

一起talk C栗子吧(第九十八回:C语言实例--使用消息队列进行进程间通信二)

各位看官们,大家好,上一回中咱们说的是使用消息队列进行进程间通信的例子,这一回咱们接着上一回的内容继续说使用消息队列进行进程间通信。闲话休提,言归正转。让我们一起talk C栗子吧!...
  • talk_8
  • talk_8
  • 2016-01-12 21:14:39
  • 1670

C例子:获取系统环境变量

  • 2016年04月03日 08:50
  • 590B
  • 下载

C例子:程序内存模型

  • 2016年03月27日 18:40
  • 795B
  • 下载

C例子: 关闭终端中的缓冲功能new

  • 2016年07月09日 08:17
  • 1KB
  • 下载

C例子:文件定位操作二

  • 2016年12月06日 21:46
  • 866B
  • 下载

C例子:DIY ls命令续

  • 2015年12月19日 08:06
  • 4KB
  • 下载
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 50万+
    积分: 8980
    排名: 2652
    博客专栏
    最新评论