目录
strlen
实现:
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);
size_t t = 0;
while(*(str + t))
{
t++;
}
return t;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
运行结果:
strcat
返回destination
实现:
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dst, const char* src)
{
assert(dst&&src);
int t = 0;
char* p = dst;
while(*p)
{
p++;
}
while(*(p + t) = *(src + t))
{
t++;
}
return dst;
}
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "123456";
printf("%s\n",my_strcat(arr1,arr2));
return 0;
}
运行结果:
strcmp
实现:
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while(*str1 == *str2 && *str1 != '\0')
{
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char str1[] = "abcdef";
char str2[] = "abcdefg";
char str3[] = "abcdef";
char str4[] = "abcde";
printf("%d\n",my_strcmp(str1,str2));
printf("%d\n",my_strcmp(str1,str3));
printf("%d\n",my_strcmp(str1,str4));
return 0;
}
运行结果:
strcpy
实现:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* p = dest;
while(*p++ = *src++);
return dest;
}
int main()
{
char arr1[10] = "abcde";
char arr2[] = "123456";
printf("%s",my_strcpy(arr1,arr2));
return 0;
}
运行结果:
strstr
实现1(bf):
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
char* my_strstr(const char* s1, const char* s2)
{
assert(s1 && s2);
int n1 = strlen(s1);
int n2 = strlen(s2);
int j = 0;
for(int i = 0; i < n1 - n2; i++)
{
int k = i;
while(j < n2 && s1[k] == s2[j])
{
k++;
j++;
}
if(j == n2)
{
return s1 + i;
}
j = 0;
}
return NULL;
}
实现2(KMP)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
int* getNext(const char* s, int n)
{
int* next = (int*)malloc(sizeof(int) * n);
int k = -1;
int j = 0;
next[0] = k;
while(j < n - 1)
{
if(k == -1 || s[j] == s[k])
{
k++;
j++;
next[j] = k;
}
else
{
k = next[k];
}
}
return next;
}
//优化求next数组
int* getNext2(const char* s, int n)
{
int* next = (int*)malloc(sizeof(int) * n);
int k = -1;
int j = 0;
next[0] = -1;
while(j < n - 1)
{
if(k == -1 || s[j] == s[k])
{
j++;
k++;
if(s[j] == s[k])
{
next[j] = next[k];
}
else
{
next[j] = k;
}
}
else
{
k = next[k];
}
}
}
char* my_strstr(const char* s1, const char* s2)
{
int n1 = strlen(s1);
int n2 = strlen(s2);
int* next = getNext(s2, n2);
int i = 0;
int j = 0;
while(i < n1 - n2 + j)
{
if(j == -1)
{
i++;
j++;
}
while(s1[i] == s2[j] && j < n2)
{
i++;
j++;
}
if(j == n2)
{
free(next);
return s1 + i - j;
}
}
free(nexr);
return NULL;
}