string.h 中5个不是很常用的函数

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;  
} 

  

posted @ 2012-09-22 20:25  庄庄庄  阅读(265)  评论(0编辑  收藏  举报