字符串函数模拟实现
1. 实现strcpy
#include<stdio.h>
#include<string.h>
#include<assert.h>
char *my_strcpy(char *des, const char *source)
{
char *p = des;
const char *q = source;
assert(des);
assert(source);
while(*p++ = *q++)
{
;
}
return p;
}
int main(){
char a[10] = "abcdefg";
char b[10];
memset(b, 0, 10);
my_strcpy(b, a);
printf("%s\n", b);
return 0;
}
2. 实现strcat
#include<stdio.h>
#include<assert.h>
char *my_strcat(char *des, const char *source)
{
char *de = des;
const char *sou = source;
assert(des);
assert(source);
while(*de) de++;
while(*de++ = *sou++)
{
;
}
}
int main()
{
char a[15] = "Oh, my ";
char *b = "god!";
my_strcat(a, b);
printf("%s\n", a);
return 0;
}
3. 实现strstr
#include<stdio.h>
#include<assert.h>
char *my_strstr(const char *str1, const char *str2)
{
char *st1 = (char *)str1;
char *st2 = (char *)str2;
char *s1 = st1;
char *s2 = st2;
assert(str1);
assert(str2);
if(*st2 == '\0')
{
return NULL;
}
while(1)
{
if(*s2 == '\0')
{
return st1;
}
if(*st1 == '\0')
{
return NULL;
}
if(*s1 == *s2)
{
s1++;
s2++;
}
else
{
st1++;
s1 = st1;
s2 = st2;
}
}
}
int main()
{
char a[] = "No one loves learning more than I do.";
char b[] = "loves ";
printf("%s\n", my_strstr(a, b));
return 0;
}
4. 实现strchr
#include<stdio.h>
#include<assert.h>
char *my_strchar(const char *str1, const char ch)
{
char *st1 = (char *)str1;
while(1)
{
if(*st1 == ch)
{
return st1;
}
if(*st1 == '\0')
{
return NULL;
}
st1++;
}
}
int main()
{
char a[] = "No one loves learning more than I do.";
char b = 'n';
printf("%s\n", my_strchar(a, b));
return 0;
}
5. 实现strcmp
int my_strcmp(const char *str1, const char *str2)
{
char *s1 = (char *)str1;
char *s2 = (char *)str2;
assert(str1);
assert(str2);
if(*s1 == '\0' && *s2 == '\0')
return 0;
else if(*s1 == '\0' && *s2 != '\0')
return -1;
else if(*s1 != '\0' && *s2 == '\0')
return 1;
while(1)
{
if(*s1 == *s2)
{
s1++;
s2++;
continue;
}
return *s1-*s2;
}
}
int main()
{
char a[] = "No one loves learning more than I do.";
char b[] = "No one Loves learning more than I do.";
int i = my_strcmp(a, b);
if(i == 0) printf("They are same.\n");
else if(i>0) printf("string a is bigger than string b\n");
else printf("string a is smaller than string b\n");
return 0;
}
6. 实现memcpy
#include<stdio.h>
void * my_memcpy(void *b, void *a, int size)
{
void *target = b;
void *source = a;
while(size--)
{
*(char *)target++ = *(char *)source++;
}
return b;
}
int main()
{
int ia[10] = {1,2,3,4,5,6,7,8,9,0};
int ib[10];
int i = 0;
char ca[] = "life is beautiful!";
char cb[30];
my_memcpy(ib, ia, 40);
my_memcpy(cb, ca, sizeof(ca));
for(i = 0; i<10; i++)
{
printf("%d ", ib[i]);
}
printf("\n%s\n", cb);
return 0;
}
7. 实现memmove
#include<stdio.h>
void * my_memmove(void *b, const void *a, int size)
{
void *target = (char *)b;
void *source = (char *)a;
if(a <=b && b <= (a+size))
{
while(size--)
{
*(char *)(target+size) = *(char *)(source+size);
}
return b;
}
while(size--)
{
*(char *)target++ = *(char *)source++;
}
return b;
}
int main()
{
int ia[10] = {1,2,3,4,5,6,7,8,9,0};
int i = 0;
char ca[] = "life is beautiful!";
char cb[30];
my_memmove(ia+1, ia, 40);
my_memmove(ca+1, ca, sizeof(ca));
for(i = 0; i<10; i++)
{
printf("%d ", ia[i]);
}
printf("\n%s\n", ca);
return 0;
}