C语言中一些有关于字符串的库函数 ( 源函数 )

  • strlen  计算字符串大小
// 计数器方法
int my_strlen(const char * str) 
{   
        int count = 0;    
        while(*str)   
        {        
            count++;        
            str++;
         }   
         return count;
}
//不创建临时变量
int my_strlen(const char * str)
{    
        if(*str == '\0')        
             return 0;        
        else        
             return 1+my_strlen(str+1); 
}
//指针-指针的方式
int my_strlen(char *s) 
{       
        char *p = s;       
        while(*p !='\0')
              p++;
       return p-s;
}
  • strcpy   从src地址开始且含有'\0'结束符的字符串复制到以dst开始的地址空间,返回值的类型为char*。
char *my_strcpy(char *dest, const char*src)
 {
       char *ret = dest;
       assert(dest != NULL);
       assert(src != NULL); 
       while((*dest++ = *src++))
            ;   
       return ret;
}
  • strcat  将两个字符连接起来
char *my_strcat(char *dest, const char *src)
{
        char *ret=dest;
        assert(dest);
        assert(src);
        while(*dest)
        {
                dest++;
        }
        while((*dest++ = *src++))
        {
                ;
        }
        return ret;
}
  • strstr 判断str2是否是str1的子串, 如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
char *my_strstr(const char* str1, const char* str2)
{
    assert(str1);
    assert(str2);
    char *cp=(char *)str1;
    char *substr=(char *)str2;
    if(*str2=='/0')
        return NULL;
    while(*cp)
    {
        s1=cp;
        substr=str2;
        while(*s1&&*substr&&(*s1==*substr))
        {
            s1++;
            substr++;
        }
        if(*substr=='\0')
            return cp;
        cp++;
        }
}
  • strcmp  比较字符串的大小  若str1==str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
int my_strcmp(const char * src, const char * dst)
{
    int ret=0;
    while(!(ret=*(unsighed char *)src-*(unsigned char *)dst)&&*dst)
        src++,dst++;
    if(ret<0)
        ret=-1;
    else if(ret>0)
        ret=1;
    return ret;
}
  • memcpy  内存拷贝 函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dst所指的内存地址的起始位置中。void * ( 无类型指针, 可以接受任何类型 )   size_t  ( 字节数 )
void * my_memcpy(void * dst, const void *src, size_t count)
{
    void * ret=dst;
    while(count--)    {
        //定义字符型,一个字节一个字节进行拷贝
        *(char *)dst=*(char *)src;
        dst=(char *)dst+1;
        src=(char *)src+1;
    }
    return ret;
}
  • memmove   用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
void * my_memmove(void *dst, const void *src, size_t count)
{
    void * ret=dst;
    //如果目标区域与源区域有重叠的部分,从后往前拷贝,
    //若没有重叠的部分,从前往后拷贝
    if(dst<=src||(char *)dst >=((char *)src+count)){
        while(count--){
            *(char *)dst=*(char *)src;
            dst=(char *)dst+1;
            src=(char *)src+1;
        }
    }
    else{
        dst=(char *)dst+count-1;
        src=(char *)src+count-1;
        while(count--){
            *(char *)dst=*(char *)src;
            dst=(char *)dst-1;
            src=(char *)src-1;
        }
    }
    return ret;
}

猜你喜欢

转载自blog.csdn.net/ds19980228/article/details/82795304