1、查找一个字符
在一个字符串查找一个特定字符最容易的方法是使用strchr和strrchr函数,原型如下所示:
char *strchr(char const *str, int ch);char *strrchr(char const *str,int ch);
注意:它们的第二个参数是一个整型值。但是,它包含了一个字符值。strchr返回字符第一次出现的位置,strrchr返回字符最后一次出现的位置。找到后函数返回指向该位置的指针,否则返回NULL。
char string[20] = "hello world";char *ans;ans = strchr(string,'w');
ans所指向的位置将是string+6。注意这里大小写是有区别的。
2、查找任何几个字符
strpbrk查找任何一组字符第一次在字符串中出现的位置,函数原型如下:
char *strpbrk(char const *str, char const *group);
这个函数返回一个指向str中第1个匹配group中任何一个字符的字符位置,如果未找到就返回NULL指针。
char string[20] = "hello world";char *ans;ans = strpbrk(string,'aeiou');
ans指向的位置是string+1,因为这个位置是第2个参数中的字符第一次出现的位置。这个函数也区分大小写。
3、查找一个子串
在一个字符串查找一个子串,可以使用strstr函数,原型如下:
char *strstr(char const *s1, char const *s2);
这个函数在s1中查找整个s2第一次出现的起始位置,并返回一个指向该位置的指针。如果s2并没有完整地出现在s1的任何地方,返回NULL指针。如果第2个参数是一个空字符串,函数就返回s1。
注意:标准库中并不存在strrstr或者strrpbrk,但是其很容易实现。下面程序实现strrstr函数。相同的技巧可用于实现strrpbrk。
#include<string.h>char *my_strrstr(char const *s1,char const *s2){register char *last;register char *current;;last = NULL;/*第2个参数不为空才查找*/if(*s2 != '\0'){current = strstr(s1,s2);/*每次找到字符串时,让指针指向它的起始位置,然后查找该字符串下一个匹配位置*/while(current != NULL){last = current;current = strstr(last+1,s2);}}return last;}
字符串查找
s.find(s1) //查找s中第一次出现s1的位置,并返回(包括0)s.rfind(s1) //查找s中最后次出现s1的位置,并返回(包括0)s.find_first_of(s1) //查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0)s.find_last_of(s1) //查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0)s.fin_first_not_of(s1) //查找s中第一个不属于s1中的字符的位置,并返回(包括0)s.fin_last_not_of(s1) //查找s中最后一个不属于s1中的字符的位置,并返回(包括0)
字符串截取
s.substr(pos, n) //截取s中从pos开始(包括0)的n个字符的子串,并返回s.substr(pos) //截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回
#include <stdio.h>#include <string.h>int main(){const char haystack[20] = "RUNOOB";const char needle[10] = "NOOB";char *ret;ret = strstr(haystack, needle);printf("子字符串是: %s\n", ret);return(0);}
#include <string.h>#include <stdio.h>int main () {char str[80] = "This is - - website";const char s[2] = "-";char *token;/* 获取第一个子字符串 */token = strtok(str, s);/* 继续获取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0);}