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;  
    }  
  • 相关阅读:
    sqoop常用命令三 ---- import导入 与export 覆盖更新,常见问题总结
    Sqoop 数据导出:全量、增量、更新
    idea 安装热部署插件
    Python学习之turtle绘图篇
    使用python自动画一只小猪佩奇(源码)
    Python turtle安装和使用教程
    PYCHARM三方库安装方法
    Impala编译部署-3
    SSLv3 SSLContext not available Tomcat
    SSLv3 SSLContext not available Tomcat
  • 原文地址:https://www.cnblogs.com/hervey/p/4660063.html
Copyright © 2011-2022 走看看