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

      

  • 相关阅读:
    PID204特种部队
    概率论,简要数学期望(转载)
    codevs1258 关路灯(☆区间dp)
    codevs3327选择数字(单调队列优化)
    codevs3002石子归并3(四边形不等式优化dp)
    codevs1154能量项链(环形dp,区间dp)
    codevs3304水果姐逛街(线段数)
    codevs3162抄书问题(划分型dp)
    浅谈一类积性函数的前缀和(转载)
    组合数取模(转载)
  • 原文地址:https://www.cnblogs.com/mathzzz/p/2698379.html
Copyright © 2020-2023  润新知