zoukankan      html  css  js  c++  java
  • 字符串常用操作实现

    、strcpy与strncpy原型

      其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy

    char* strcpy(char *strDest, const char *strSrc)  
    {  
        if ( strDest == NULL || strSrc == NULL)
            return NULL ;
        if ( strDest == strSrc)
            return strDest ;
        char* res = strDest;  
        while(*strDest++ = *strSrc++)  
        {  
            NULL;  
        }  
        return res;  
    }
    /*
    功能为拷贝字符串内容到目的串,把src所指向的内容的前num个字符拷贝到dest;
    标准库中返回指针不是以null即''结束的,必须手动添加
    */
    char* strncpy(char* strDest , const char* strSrc , unsigned int num)
    {
        if ( strDest == NULL || strSrc == NULL)
                return NULL ;
    
        if (0 == num)
        {
            *strDest = '';
            return strDest ;
        }
    
        char* res = strDest ;
        while(*strDest ++ = *strSrc ++)
        {
            if (--num == 0)
            {
                *strDest = '';
                break;
            }
        }
        return res;
    }

    二、strcat与strncat原型

      

    //////////////////////////////////////////////////////////////////////////  
    //功能为连接两个字符串,把src连接到dest后面;返回dest地址;  
    //////////////////////////////////////////////////////////////////////////  
    char* strcat(char* dest, const char* src)  
    {  
        if ( dest== NULL || src== NULL)
            return NULL ;
          
        char* res = dest;  
        while(*dest)     // *dest != ''   
        {  
            dest++;  
        }  
        while (*dest++ = *src++)  
        {  
            NULL;  
        }  
      
        return res;  
    }  
    /* 
    //功能为连接两个字符串,把src连接到dest后面;返回dest地址; 
    */  
    char* strncat(char* dest, const char* src, unsigned int num)  
    {  
        if ( dest== NULL || src== NULL)
            return NULL ; 
      
        if (!num)  
        {  
            return dest;  
        }  
      
        char* res = dest;  
        while(*dest)     // *dest != ''   
        {  
            dest++;  
        }  
        while(*dest++ = *src++)  
        {  
            if (--num == 0)  
            {  
                *dest = '';  
                break;  
            }  
        }  
      
        return res;  
    }  

    三、strlen原型

    //////////////////////////////////////////////////////////////////////////  
    //功能为返回字符串str的长度(不包括'');  
    //size_t strlen ( const char * str );  
    //////////////////////////////////////////////////////////////////////////  
    unsigned int strlen(const char* str)  
    {  
        if (str == NULL)
            return 0;
        unsigned int len = 0;  
        while(*str++)  
        {  
            len++;  
        }  
        return len;  
    }     

    四、strcmp与strncmp原型

    //////////////////////////////////////////////////////////////////////////  
    //功能为比较两个字符串;  
    //当str1指向的字符串大于str2指向的字符串时,返回正数。  
    //当str1指向的字符串等于str2指向的字符串时,返回0。  
    //当str1指向的字符串小于str2指向的字符串时,返回负数。;  
    //////////////////////////////////////////////////////////////////////////  
    int strcmp(const char* str1, const char* str2)  
    {  
        assert((str1 != NULL) && (str2 != NULL));  
      
        while (*str1 && (*str1 == *str2))  
        {  
            str1++;  
            str2++;  
        }  
        return *str1-*str2;  
    }  
    //////////////////////////////////////////////////////////////////////////  
    //功能为比较两个字符串前num个字符;  
    //当str1指向的字符串大于str2指向的字符串时,返回正数。  
    //当str1指向的字符串等于str2指向的字符串时,返回0。  
    //当str1指向的字符串小于str2指向的字符串时,返回负数。;  
    //////////////////////////////////////////////////////////////////////////  
    int strncmp(const char* str1, const char* str2, unsigned int num)  
    {  
        assert((str1 != NULL) && (str2 != NULL));  
      
        if (!num)  
            return 0;  
      
        while (--num && *str1 && (*str1 == *str2))  
        {  
            str1++;  
            str2++;  
        }  
        return *str1-*str2;  
    } 

    五、strchr与strrchr原型

    //////////////////////////////////////////////////////////////////////////  
    //功能为查找str中首次出现c的位置,如有有,则返回出现位置,否则返回NULL;  
    //////////////////////////////////////////////////////////////////////////  
    /* 
    const char * strchr ( const char * str, int character ); 
    char * strchr (       char * str, int character ) 
    */  
    char* strchr(char* str, char c)  
    {  
        if (NULL == str)
             return NULL;
      
        while(*str && *str != c)  
        {  
            str++;  
        }  
        if (*str == c)  
            return str;  
      
        return NULL;  
    }  
    //////////////////////////////////////////////////////////////////////////  
    //功能为查找str中最后一次出现c的位置,如有有,则返回出现位置,否则返回NULL;  
    //////////////////////////////////////////////////////////////////////////  
    char* strrchr(char* str, char c)  
    {  
        if (NULL == str)
            return NULL;
          
        char* res = str;  
        while(*res++)  
            ;  
        while((--res != str) && (*res != c))  
            ;  
        if (*res == c)  
            return res;  
      
        return NULL;  
    }

    六、strspn与strcspn原型

    //////////////////////////////////////////////////////////////////////////  
    //功能:在字符串str1中搜寻str2中所出现的字符  
    //说明:返回第一个出现的字符在s1中的下标值  
    //亦即在s1中出现而s2中没有出现的子串的长度;  
    //////////////////////////////////////////////////////////////////////////  
    unsigned int strcspn ( const char * str1, const char * str2 )  
    {  
        assert((str1 != NULL) && (str2 != NULL));  
        // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8]  
        unsigned char map[32] = {0};  
      
        // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111));  
        // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在;  
        while(*str2)  
        {  
            map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));  
            str2++;  
        }  
        map[0] |= 1;  
      
        unsigned int count = 0;  
        while(!(map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))  
        {  
            count++;  
            str1++;  
        }  
      
        return count;  
    }
    //返回字符串中第一个不在指定字符串中出现的字符下标  
    //亦即第一个在s1中出现且s2中存在的子串的长度;  
    unsigned int strspn(char* str1, char* str2)  
    {  
        assert((str1 != NULL) && (str2 != NULL));  
        // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8]  
        unsigned char map[32] = {0};  
      
        // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111));  
        // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在;  
        while(*str2)  
        {  
            map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));  
            str2++;  
        }  
        map[0] |= 0;  
      
        unsigned int count = 0;  
        while((map[*str1 >> 3] & (unsigned int)(1 << (*str1 & 7))))  
        {  
            count++;  
            str1++;  
        }  
        return count;  
    }
    int strspn(const char *s,const char *accept)
    {
        const char *p;
        const char *a;
        int count = 0;
        for(p = s; *p != ''; ++p)
        {
            for (a = accept; *a != ''; ++a)
            {
                if (*p == *a)
                {
                    break;
                }
            }//里面的for循环到此为止
            if (*a == '')
            {
                return count;
            }
            ++count;
        }    //外面的for循环到此为止
        return count;
    }

    七、strstr原型

    //需找str字符串中出现strSearch字符串位置的指针。如果没找到,则返回NULL,如果strSearch为空,则返回str;  
    char* strstr(char* str,char* strSearch)  
    {  
        /* 
        int length1=strlen(str);   
        int length2=strlen(strSearch);   
        while(length1>=length2)   
        {   
            length1--;   
            if(!strncmp(str,strSearch,length2))//比较前n个字符串; 
                return str;   
            str++;   
        }   
        return NULL;  
        */  
        char* b = strSearch;  
        if( *b == NULL )  
        {  
            return str;  
        }  
          
        char* a = NULL;  
        for( ; *str != NULL; str++)   
        {  
            if( *str != *b )   
            {  
                continue;  
            }  
      
            a = str;  
            while(1)   
            {  
                if( *b == NULL )   
                {  
                    return str;  
                }  
                if( *a++ != *b++ )   
                {  
                    break;  
                }  
            }  
      
            b = strSearch;  
        }  
      
        return NULL;  
    }  

    八、strpbrk原型

    //在源字符串(str1)中找出最先含有搜索字符串(str2 )中的任一字符的位置并返回,若找不到则返回空指针;  
    //与strnspn的算法一样,只是前者返回相同字符的指针位置,后者返回相同字符的个数;  
    char* strpbrk(char* str1,char* str2)  
    {  
        assert((str1 != NULL) && (str2 != NULL));  
        // map有32个字节的大小,也就是256个bit,可把map堪称一个2维数组[32][8]  
        unsigned char map[32] = {0};  
      
        // 每个ASCII码(设为c)有8bit,把它分成2部分,低3位构成下标j(通过c&7(2进制为111));  
        // 高5位构成下标i(通过c>>3得到)。这样在map[i][j]中置1表示字符存在;  
        while(*str2)  
        {  
            map[*str2 >> 3] |= (unsigned int)(1 << (*str2 & 7));  
            str2++;  
        }  
        map[0] |= 1;  
      
        while(*str1)  
        {  
            // 如果有相同的字符则返回;  
            if( map[*str1 >> 3] & (1 << (*str1 & 7)) )  
                return str1++;  
      
            str1++;  
        }  
      
        return NULL;  
    }  
  • 相关阅读:
    不可小视视图对效率的影响力
    Maximum Margin Planning
    PhysicsBased Boiling Simulation

    Learning Behavior Styles with Inverse Reinforcement Learning
    Simulating Biped Behaviors from Human Motion Data
    Nearoptimal Character Animation with Continuous Control
    Apprenticeship Learning via Inverse Reinforcement Learning
    回报函数学习的学徒学习综述
    Enabling Realtime Physics Simulation in Future Interactive Entertainment
  • 原文地址:https://www.cnblogs.com/hervey/p/4660063.html
Copyright © 2011-2022 走看看