目录
一.strlen函数
1.描述
2.实现
1.计数的方法
2.函数递归的方法
3.指针 - 指针方法
二.strcmp函数
1.描述
2.实现
三.strcpy函数的实现
1.描述
2.实现
四.strcat函数的实现
1.描述
2.实现
五.strstr函数的实现
1.描述
2.实现
1.BF算法实现
2.kmp算法的实现
一.strlen函数
1.描述
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。strlen函数实际上时以size_t为返回类型遍历字符串,直到遇到'\0'停止遍历,返回字符串长度的函数。其*str为需要计算的字符串
2.实现
1.计数的方法
size_t my_strlen(const char* dest)
{assert(dest);int count = 0;while (*dest){count++;dest++;}return count;
}
2.函数递归的方法
size_t my_strlen(const char* dest)
{assert(dest);if (*dest) return 1 + my_strlen(dest + 1);else return 0;
}
3.指针 - 指针方法
size_t my_strlen(const char* dest)
{assert(dest);const char* ret = dest;while (*dest++){;}return dest - ret;
}
二.strcmp函数
1.描述
strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
2.实现
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}return (*str1 - *str2);
}//范围值为0时说明两个字符串相同,输出大于0的时候说明str1大于str2,小于相反
三.strcpy函数的实现
1.描述
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况
2.实现
char* my_strcpy(char* dest, const char* src)
{assert(dest&&src);char* ret = dest;while (*dest++ = *src++){;}return ret;
}
四.strcat函数的实现
1.描述
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
2.实现
char* my_strcat(char* dest, const char* str)
{char* ret = dest;while (*dest){dest++;}while (*dest++ = *str++){;}return ret;
}
五.strstr函数的实现
1.描述
C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
2.实现
1.BF算法实现
char* my_strstr2(const char* str1, const char* str2)
{//BF方法,返回指针int lenstr1 = strlen(str1);int lenstr2 = strlen(str2);int i = 0;int j = 0;while (i < lenstr1 && j < lenstr2){if (*(str1 + i) == *(str2 + j)){i++;j++;}else{i = i - j + 1;j = 0;}//假如没找到就j = 0,i返回之前找的位置的后一位 }if (j >= lenstr2)//走完了子串{char* ret = (char*)str1 + (i - j);//str是const char*类型因此我们需要强制类型转换一下转换成为char*return ret;}return NULL;
}
2.kmp算法的实现
void Getnext(int* next, const char* sub)
{int len = strlen(sub);next[0] = -1;next[1] = 0;int i = 2;//从next[2]开始遍历int k = 0;while (i < len){//i一直往前走,k可以变换if ((k == -1) || (sub[k] == sub[i - 1]))//因为数组整体往右加一{//当sub[k] == sub[i]//next[i+1] == k + 1 next[i] = k + 1;i++;k++;}else{k = next[k];}}}
int kmp(const char* str,const char* sub, int pos)
{//str为主串,sub为子串assert(str && sub);int i = pos;int j = 0;int lenstr = strlen(str);int lensub = strlen(sub);int* next = (int*)malloc(sizeof(int) * lenstr);assert(next);Getnext(next,sub);while (i < lenstr && j < lensub){if ((j == -1) || (sub[j] == str[i])){//j == -1时next[0] = -1j++;i++;}else{j = next[j];}}free(next);if (j >= lensub){return i - j;}return -1;}