字符串常用操作实现

、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;  
}  
原文地址:https://www.cnblogs.com/hervey/p/4660063.html