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;
}