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