目录
一.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] = -1
j++;
i++;
}
else
{
j = next[j];
}
}
free(next);
if (j >= lensub)
{
return i - j;
}
return -1;
}