char *strchr(const char *str, int c); // 从前到后扫描,返回str中第一次包含字符c的地址,如果没有返回NULL;
char *strrchr(const char *str, int c); // 从后到前扫描,。。。。。。。。。。。。。。。。
size_t strspn(const char *str, const char *set); // str开始连续的字符出现在set中的个数
size_t strcspn(const char *str, const char *set); // str开始连续的字符不出现在set中的个数
char *strpbrk(const char *str, const *delim); // 以delim为分割字符集,删去str中的第一个“子字符串”
strspn("123456", "231") == 3
strspn("123456", "123") == 3
strspn("12/3456", "123") == 2
strspn("1/23456", "123") == 1
strcspn("aaaa123456", "123") == 4
strcspn("aa123456", "123") == 2
strpbrk("http://www.baidu.com", ":/.") == "://www.baidu.com"
strpbrk("http://www.baidu.com", "?;") == NULL
/***********************************************************************
*
* 以c为分割符,返回str的第一个“子字符串”
*
***********************************************************************/
char *my_strchr(const char *str, int c)
{
while(*str && *str != (char)c)
str++;
if(*str == '\0')
return NULL;
return str;
}
/***********************************************************************
*
* 以c为分割符,返回str最后1个“子字符串”
*
***********************************************************************/
char *my_strrchr(const char *str, int c)
{
char *cp = str;
while(*str++);
while(cp != str && *--str != (char)c)
;
return cp == str ? NULL:str;
}
/***********************************************************************
*
* str开始连续的字符出现在set中的个数
*
***********************************************************************/
my_size_t my_strspn(const char *str, const char *set)
{
char map[32]={0};
while(*set){
map[*set>>3] |= 1<<(*set&7);
set++;
}
my_size_t count=0;
while( map[*str>>3] & (1<<(*str&7)) ) // *str belong to set 且 *str != 0
count++, str++;
return count;
}
/***********************************************************************
*
* str开始连续的字符都不出现在set中的个数
*
***********************************************************************/
my_size_t my_strcspn(const char *str, const char *set)
{
char map[32]={0};
while(*set){
map[*set>>3] |= 1<<(*set&7);
set++;
}
my_size_t count=0;
while(*str){
if( map[*str>>3] & 1<<(*str&7)) // *str belong to set 返回
return count;
count++, str++;
}
return count;
}
/***********************************************************************
*
* 以delim 为分割字符集,删去第一个str中第一个“子字符串”后剩下的。。
*
***********************************************************************/
char *my_strpbrk(const char *str, const char *delim)
{
char map[32] = {0};
while(*delims){
map[*delims>>3] |= 1<<(*delims&7);
delims++;
}
while(*str){
if(map[*str>>3] & 1<<(*str&7)) // *str belong to set 返回
return str;
str++;
}
return NULL;
}
两个常用的字符串解析函数:
strsep使用如下:
char *str = strdup("This is a example to test the function of strsep");
char *p = NULL;
while(NULL != ( p = strsep(&str, " "))
{
puts(p);
}
而strtok使用如下:
第一次要指定待分割字串,接下来则要传NULL。
char *str = strdup("This is a example to test the function of strsep");
char *p = NULL;
char *tmp = str;
while (NULL != (p = strsep(tmp, " ")))
{
puts(p);
tmp = NULL;
}