在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结。
使用 strchr 与 strrchr 函数查找单个字符
如果需要对字符串中的单个字符进行查找,那么应该使用 strchr 或 strrchr 函数。其中,strchr 函数原型的一般格式如下:
1 char *strchr(const char*s,int c);
它表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。也就是说,strchr 函数在字符串 s 中从前到后(或者称为从左到右)查找字符 c,找到字符 c 第一次出现的位置就返回,返回值指向这个位置,如果找不到字符 c 就返回 NULL。
相对于 strchr 函数,strrchr 函数原型的一般格式如下:
1 char *strrchr(const char*s,int c);
与 strchr 函数一样,它同样表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。但两者唯一不同的是,strrchr 函数在字符串 s 中是从后到前(或者称为从右向左)查找字符 c,找到字符 c 第一次出现的位置就返回,返回值指向这个位置。下面的示例代码演示了两者之间的区别:
1 int main(void) 2 { 3 char str[] = "I welcome any ideas from readers, of course."; 4 char *lc = strchr(str, 'o'); 5 printf("strchr: %s ", lc); 6 char *rc = strrchr(str, 'o'); 7 printf("strrchr: %s ", rc); 8 return 0; 9 }
对于上面的示例代码,strchr 函数是按照从前到后的顺序进行查找,所以得到的结果为“ome any ideas from readers,of course.”; 而 strrchr 函数则相反,它按照从后到前的顺序进行查找,所以得到的结果为“ourse.”。
最后还需要注意的是,为什么函数的“c”参数是 int 类型,而不是“char”类型呢?
其实原因很简单,这里用的是字符的 ASCII 码(因为每个字符都对应着一个 ASCII 码),这样在传值的时候既可以传“char”类型的值,又可以传“int”类型的值(0~127)。
使用 strpbrk 函数查找多个字符
上面的 strchr 与 strrchr 函数解决了对字符串中单个字符的查找,那么需要查找多个字符时怎么办呢?
如果要查找多个字符,就需要使用 strpbrk 函数了。该函数在源字符串(s1)中按从前到后顺序找出最先含有搜索字符串(s2)中任一字符的位置并返回,空字符 null(' ') 不包括在内,若找不到则返回空指针。其函数原型的一般格式如下:
1 char *strpbrk(const char *s1,const char*s2);
例如,在 strpbrk 函数的定义如下:
1 char *strpbrk (const char *s, const char *accept) 2 { 3 while (*s != '