str系列---字符串函数

1、 strcat
  extern char *strcat(char *dest,char *src);

  把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。

  返回指向dest的指针。

复制代码
//将源字符串加const,表明其为输入参数
char* strcat(char* strDest , const char*s trSrc)
{
    //后文return address,故不能放在assert断言之后声明address
    char* address=strDest;
    assert( (strDest!=NULL)&&(strSrc!=NULL) );//对源地址和目的地址加非0断言
    while(*strDest)//是while(*strDest!=’\0’)的简化形式
    {
        //若使用while(*strDest++),则会出错,因为循环结束后strDest还会执行一次++,
        //那么strDest将指向'\0'的下一个位置。/所以要在循环体内++;因为要是*strDest最后指
        //向该字符串的结束标志’\0’。
        strDest++;
    }
 
    while(*strDest++=*strSrc++)
    {
        NULL;//该循环条件内可以用++,
    }//此处可以加语句*strDest=’\0’;无必要
    return address;//为了实现链式操作,将目的地址返回
}
View Code
复制代码


2、 strchr

  char * strchr (const char *s,int c);

  找出参数s字符串中第一个出现的参数c地址,然后将该字符出现的地址返回。

复制代码
char*strchr(char *s,char c)
{
    while(*s!='\0'&&*s!=c)
    {
    ++s;
    }
    return*s==c?s:NULL;
}
    
View Code
复制代码

 

3、 strrchr

  char *strrchr(const char *str, char c);

  查找一个字符c在另一个字符串str中末次出现的位置,然后将该字符出现的地址返回。

 

4、 strcmp

  int strcmp(const char *s1,const char *s2);

  当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数

复制代码
/*strcmp function*/
#include <string.h>
int strcmp(const char *sl,const char *s2)
{
    /*compare unsigned char sl[],s2[]*/
    for(;*sl==*s2;++sl,++s2)
        if(*sl=='\0')
            return(0);
    return((*(unsignedchar*)sl<*(unsignedchar*)s2)?-1:+1);
}
View Code
复制代码


5、 strcpy

  extern char *strcpy(char* dest, const char *src);

  把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间

  返回指向dest的指针。

复制代码
/**********************
*C语言标准库函数strcpy的一种典型的工业级的最简实现
*返回值:目标串的地址。
*对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。
*参数:des为目标字符串,source为原字符串
*/

char* strcpy(char* des,const char* source)
{
 char* r=des;
 while((*(des++)=*(source++))!='\0');
 return r;
}

/*while((*des++=*source++));的解释:赋值表达式返回左操作数,所以在赋值NULL后,循环停止*/
View Code
复制代码

 

6、 strcasecmp

  int strcasecmp (const char *s1, const char *s2);

  用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异。

 

7、 strcspn

  size_t strcspn ( const char *s,const char * reject);

  从参数s字符串的开头计算连续的字符,而这些字符都完全不在参数reject所指的字符串中。

  返回字符串s开头连续不含字符串reject内的字符数目。

 

8、 strdup

  extern char *strdup(char *s);

  strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。

  返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。

 

9、 strlen

  extern unsigned int strlen(char *s);

  计算字符串s的(unsigned int型)长度,不包括'\0'在内

  返回s的长度,不包括结束符NULL。

 

10、 strpbrk

  char *strpbrk(const char *cs,const char *ct);

  依次检验字符串s1中的字符,当被检验字符在字符串s2中也包含时,则停止检验,并返回该字符位置,空字符NULL不包括在内。

  返回s1中第一个满足条件的字符的指针,如果没有匹配字符则返回空指针NULL。

复制代码
char * strpbrk(const char * cs,const char * ct)
{
    const char *sc1,*sc2;
    for( sc1 = cs; *sc1 != '\0'; ++sc1)
    {
        for( sc2 = ct; *sc2 != '\0'; ++sc2)
        {
            if (*sc1 == *sc2)
            {
                return (char *) sc1;
            }
        }
    }
    return NULL;
}
View Code
复制代码


11、 strspn

  size_t strspn (const char *s,const char * accept);

  strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。

复制代码
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;
}
View Code
复制代码


12、 strstr

  char *strstr(const char *haystack,const char *needle);

  strstr()会从字符串haystack 中搜寻字符串needle,并将第一次出现的地址返回;否则返回NULL。

复制代码
char *strstr(constchar*s1,constchar*s2)
{
    int n;
    if(*s2)
    {
        while(*s1)
        {
            for(n=0;*(s1+n)==*(s2+n);n++)
            {
                if(!*(s2+n+1))
                    return(char*)s1;
            }
            s1++;
        }
        return NULL;
    }
    else
        return (char*)s1;
}
View Code
复制代码
复制代码
char *strstr(const char*s1,const char*s2)
{
    const char*p=s1;
    const size_tlen=strlen(s2);
    for(;(p=strchr(p,*s2))!=0;p++)
    {
        if(strncmp(p,s2,len)==0)
            return (char*)p;
    }
    return(0);
}
View Code
复制代码


13、 strtok

  char * strtok(char *s,const char *delim);

  用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为'\0'字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回下一个分割后的字符串指针。

  返回下一个分割后的字符串指针,如果已无从分割则返回NULL。

posted @   艾欧尼亚  阅读(838)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示