字符串查找
查找一个字符
strchr和strrchr 函数是 string.h 的头文件中定义的 它们的函数原型是 :
char * strchr ( char const *str, int ch); char *strrchr ( char const *str, int ch);
strchr 功能是返回字符第一次出现在字符串中的位置,strrchr 的功能是返回最后一次出现字符串中的位置。如果不存在返回NULL指针。
查找任何几个字符
strpbrk 这个函数是 string.h 的头文件中定义的 它的函数原型是:
char *strpbrk( char const *str, char const *group );
函数的功能是返回一个指向 str 中第一个匹配 group 中任何一个字符的字符位置,如果未找到返回一个NULL指针。
例:
#include<stdio.h> #include<string.h> int main() { char str[]="Hello World"; printf("%s",strpbrk(str,"aqdlze")); }
输出:
ello World
查找一个子串
strstr 这个函数是 string.h 的头文件中定义的 它的函数原型是 :
char *strstr( char const *s1,char const *s2);
这个函数在s1中查找整个s2第一次出现的位置,并返回一个指向该位置的指针,如果s2没有完全的出现在s1的任何位置就返回一个NULL指针,如果s2是一个空字符串就返回s1。
查找一个字符串前缀
strspn 和 strcspn 这两个函数的原型是:
size_t strspn ( char const *str, char const * group ); size_t strcspn ( char const *str, char const * group );
strspn() 从参数 str 字符串的开头计算连续的字符,而这些字符都完全是 group所指字符串中的字符。简单的说,若 strspn() 返回的数值为n,则代表字符串 str 开头连续有 n 个字符都是属于字符串 group内的字符。
例:
#include<stdio.h> #include<string.h> int main() { char *str="bcda adb,123"; printf("%d ",strspn(str,"abcd123")); printf("%d ",strspn(str,"abcd123 ")); printf("%d ",strspn(str,"abcd123 ,")); }
strcspn 的功能正好和 strspn 相反:
#include<stdio.h> #include<string.h> int main() { char *str="bcda adb,123"; printf("%d ",strcspn(str,"123")); printf("%d ",strcspn(str,",")); printf("%d ",strcspn(str,"123 ,")); }
查找标记
strtok 这个函数是 string.h 的头文件中定义的 它的函数原型是:
char * strtok(char *str, const char *sep);
sep是分隔字符串集合,str 中包含了零个或多个sep中的一个或多个分隔标记,strtok 的功能就是找出 str 中的下一个标记,并将其用NUL结尾,返回指向这个标记的指针。需要注意的是 str 参数不是只读的,在函数中它将会被改变,所以如果传入的参数是不可以改变的,那个就应该提前对这个字符串进行复制,然后再传入函数中。
例:
#include<stdio.h> #include<string.h> int main() { char str1[]="abc,def ghi,jkl"; char *s1; s1=strtok(str1," ,"); printf("%s\n",str1); printf("%s\n",s1); char str2[]="123 def\nasd"; char *s2; s2=strtok(str2,"\n"); printf("%s\n",str2); printf("%s",s2); }
输出:
abc
abc
123 def
123 def
那么这样就会出现一个问题,因为加了一个NUL所以字符串只后面的部分访问不到了,我想这和你最初的想法肯定背道而驰了,那么应该如何解决这个问题那?
请看下面一段代码:
#include<stdio.h>
#include<string.h>
void print_tok(char *line,char const *sign)
{
char *tok;
for( tok = strtok(line, sign); tok != NULL; tok = strtok(NULL, sign) )
{
printf("%s\n",tok);
}
}
int main()
{
char str[]="asd zxc qwe";
print_tok(str," ");
}
输出:
asd
zxc
qwe
为什么会这样,因为如果 strtok 的第一个参数是NULL函数就在同一个字符串中从保存的位置开始像前面一样查找下一个标记,如果字符串中不存在更多的标记,就返回一个NULL指针。strtok 函数会保存它的处理状态的局部信息,所以在处理完一个字符串前不可以处理另一个字符串。