您的位置:首页 > 其它

字符串常用操作实现

2015-07-19 22:56 381 查看

一、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即'\0'结束的,必须手动添加
*/
char* strncpy(char* strDest , const char* strSrc , unsigned int num)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;

if (0 == num)
{
*strDest = '\0';
return strDest ;
}

char* res = strDest ;
while(*strDest ++ = *strSrc ++)
{
if (--num == 0)
{
*strDest = '\0';
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 != '\0'
{
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 != '\0'
{
dest++;
}
while(*dest++ = *src++)
{
if (--num == 0)
{
*dest = '\0';
break;
}
}

return res;
}


三、strlen原型

//////////////////////////////////////////////////////////////////////////
//功能为返回字符串str的长度(不包括'\0');
//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 != '\0'; ++p)
{
for (a = accept; *a != '\0'; ++a)
{
if (*p == *a)
{
break;
}
}//里面的for循环到此为止
if (*a == '\0')
{
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: