实现字符串的一些常用字符串函数

1  size_t my_strlen(const char *string);   // 字符串长度

   

size_t my_strlen(const char *string)   // 字符串长度
{
    int len = 0;
    const char *str = string;

    if(string == NULL){
        return len;
    }
    while(str[len++] != '\0');
   
    return len;
}

2 char *my_strcpy(char *des_str, const char *src_str);   //字符串拷贝

char *my_strcpy(char *des_str, const char *src_str)   //字符串拷贝
{
     char *des = des_str;
     const char *src = src_str;

     if(des_str == NULL || src_str == NULL 
     || des_str == src_str){
         return des_str;
     }

     while((*des++ = *src++) != '\0'){
         /*do nothing*/
     }

     return des_str;
}

这个是带长度的,实际上也没有多大的区别

char *my_strncpy(char *des_str, const char *src_str, size_t num)
{
     char *des = des_str;
     const char *src = src_str;

     if(des_str == NULL || src_str == NULL 
     || des_str == src_str || num <= 0){
         return des_str;
     }

     while( num-- && (*des++ = *src++) != '\0'){
         /*do nothing*/
     }

     return des_str;
   
}   
3 char *my_strcat(char *des_str, const char *src_str);   //字符串链接,这个里面用到了my_strlen,尽量不要重复造轮


char *my_strcat(char *des_str, const char *src_str)   //字符串链接
{
    char *des = des_str;
    const char *src = src_str;
    int des_len = 0;

    if(des_str == NULL || src_str == NULL){
        return NULL;
    }

    des_len = my_strlen(des_str);
    des += des_len;   //让des指向‘\0‘

    // my_strcpy(des, src);
    while((*des++ = *src++) != '\0');

    return des_str;
}
这个也是比较安全的my_strncpy
char *my_strncpy(char *des_str, const char *src_str, size_t num)
{
     char *des = des_str;
     const char *src = src_str;

     if(des_str == NULL || src_str == NULL 
     || des_str == src_str || num <= 0){
         return des_str;
     }

     while( num-- && (*des++ = *src++) != '\0'){
         /*do nothing*/
     }

     return des_str;
   
}   
4 int   my_strcmp(const char *string1, const char *string2);   //字符串的比较


int   my_strcmp(const char *string1, const char *string2)   //字符串的比较
{  
     const char *str1 = string1;
     const char *str2 = string2;

    // hello\0       str1
    //
    // hello,world!  str2 
    //
    // hello,world!  str1
    //
    // hello\0       str2

     assert((string1 != NULL) && (string2 != NULL));
     
     while(*str1 && *str2 && *str1 == *str2){
         str1++;
         str2++;
     }     

     return (*str1 - *str2);
}

5 //字符的查找,返回值为地址
char *my_strchr(const char *string, int ch);

/字符的查找,返回值为地址
char *my_strchr(const char *string, int ch)
{
    const char *str = string;

    if(string == NULL){
        return NULL;
    }

    while(*str != '\0'){
        if(*str == (char)ch){
            return (char *)str;
        }
        str++;
    }
    return NULL;
}
6 //字符查找,返回值为下标
   int find_index(const char *string, int ch);

//字符查找,返回值为下标
int find_index(const char *string, int ch)
{
    char *find = my_strchr(string, ch);
    if(find != NULL){
        return find - string;
    }else{ 
        return -1;
    }
}

7 //字符查找,最后一次出现的位置
char *strrchr(const char *string, int ch);

//字符查找,最后一次出现的位置
char *strrchr(const char *string, int ch)
{
    const char *str = string;
    char *p_char = NULL;

    if(string == NULL){ 
        return p_char;
    }
    
    while(*str != '\0'){
        if(*str == (char)ch){ 
            p_char = (char *)str;
        }
        str++;
    }
    return p_char;
}

8  //从头到尾匹配string中的字符,返回首次失配前能够匹配的字符个数
size_t my_strspn(const char *string, const char *accept);


size_t my_strspn(const char *string, const char *accept)
{
    const char *str = string;
    const char *acc = NULL;

    if(string == NULL || accept == NULL){ 
        fprintf(stderr, "argument is invalid!\n");
        exit(1);
    }
    
    //hello,world   string
    //
    //elho          accept
    //
    // 11 * 4
    //
    //
    while(*str != '\0'){
        acc = accept;
        while(*acc != '\0'){
            if(*acc == *str){
                break ;
            }
            acc++;
        }
        if(*acc == '\0'){
            return str - string;
        }
        str++;
    }
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值