【C语言】C语言字符串函数实现(二)

6.字符串的查找(模式匹配)

char *my_strstr(const char *string1, const char *string2);

7.统计匹配(失配)的字符个数
匹配:

size_t my_strspn(const char *string, const char *accept);

失配:

size_t my_strcspn(const char *string, const char *reject);

8.字符串分割函数

char *my_strtok(char *string, const char *delim);

9.内存操作
移动:

void *my_memove(void *des_str, void *src_str, size_t size);

6.字符串的查找(模式匹配)

char *my_strstr(const char *string1, const char *string2)
{
    const char *str1 = string1;
    const chat *str2 = string2;

    if(string1 == NULL || string2 == NULL)
        return NULL;
    }
    while(*str1 && *str1){
        if(*str1 == *str2){
            str1++;
            str2++;
        }else{
            str1 -= (str2 - string2 -1);
            str2 = string2;
        }
    }
    if(*str2 == '\0'){
        return (str1 -= (str2 - string2));
    }
    return NULL;
}

7.统计匹配(失配)的字符个数
匹配:

size_t my_strspn(const chat *string, const char *accept)
{
    char ch_table[256] = {0};
    const char *str = string;
    const char *acc = accept;
    int match_count = 0;
    if(string == NULL)
    hash_char(acc,ch_table); //把accept字符串元素进行散列
    while(*str != '\0'){
        if(ch_table[*str]){
            match_count++;
        }else{
            return match_count;
        }
        str++;
    }
    return match_count;
}

static void hash_char(const char *accept, char *ch_table)
{
    while(*accept != '\0'){
        ch_table[*accept]++;
        accept++;
    }
}

失配:

size_t my_strcspn(const char *string, const char *reject)
{
    char ch_table[256] = {0};
    const char *str = string;
    const char rej = reject;
    int match_count = 0;
    if(string == NULL)
    hash_char(rej,ch_table); //把accept字符串元素进行散列
    while(*str != '\0'){
        if(!ch_table[*str]){
            match_count++;
        }else{
            return match_count;
        }
        str++;
    }
    return match_count;
}

static void hash_char(const char *reject, char *ch_table)
{
    while(*reject != '\0'){
        ch_table[*reject]++;
        reject++;
    }
}

8.字符串分割函数

#define ASCII_SIZE (32)
char *my_strtok(char *string, const char *delim)
{
    unsigned char *str = NULL;
    char arr[ASCII_SIZE] = {0};
    const unsigned char *delimit=(const unsigned char*)delimiter;
    static unsigned char *last = NULL;

    do{
        arr[*delimit >> 3] |= (1 << (*delimit &7));
    }while(*delimit != '\0');

    if(string == NULL){
        str = last;
    }else{
        str = (unsigned char *)string;
    }

    while(arr[*str >> 3] & (1 << (*str & 7)) && *str){
        str++;
    }


    for( ; *str; ++str){
        if(arr[*str >> 3] & (1 << (*str & 7))){
            *str++ = '\0';
            break;
        }
    }

    last = str;

    if(string == (char *)str){
        return NULL;
    }else{
        return string;
    }
}

9.内存操作
移动:

void *my_memove(void *des_str, void *src_str, size_t size);
{
    char *dest = dest_str;
    const char *src = src_str;

    if(dest_str == NULL || src_str == NULL 
      || dest_str == stc_str){
    return dest_str;
    }

    if(dest > src && (dest - src) < size){
        while(size--){
            dest[size] = src[size];
        }
    }else{
        while(size--){
            *dest++ = *src++;
        }
    }
    return dest_str;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值