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

来源:互联网 发布:淘宝网小衫 编辑:程序博客网 时间:2024/03/29 01:07

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 0