模拟实现一些简单的库函数
- strlen
- strcpy
- strcat
- strcmp
- strstr
- memcpy
- memmove
strlen的模拟实现
- strlen是用来求字符串长度,从首字符开始数,一直到
'\0'
才停下。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strlen(const char* str)
{
int count = 0;
assert(str);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "this is life";
int ret = my_strlen(arr);
printf("%d\n", ret);
system("pause");
return 0;
}
strcpy的模拟实现
- strcpy是用来拷贝字符串的,将源字符串拷到目标字符串,所以目标空间要保证足够大。
char *my_strcpy(char *dest, const char *src)
{
char *ret = dest;
assert(dest && src);
while (*src != '\0')
{
*dest = *src;
src++;
dest++;
}
*dest = '\0';
return ret;
}
int main()
{
char arr1[20] = "aaaaaaaaaaaa";
char arr2[] = "world";
printf("%s\n", my_strcpy(arr1, arr2));
system("pause");
return 0;
}
strcat的模拟实现
- strcat是用来连接字符串的,将源字符串连接到目标字符串中,找到源字符串的’\0’,然后挨着往后拷贝,所以要保证目标空间足够大。
char *my_strcat(char *dest, const char *src)
{
char *ret = dest;
assert(dest && src);
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = " world";
printf("%s\n", my_strcat(arr1, arr2));
system("pause");
return 0;
}
strcmp的模拟实现
- strcmp是用来比较字符大小的,如果相等,返回0;如果第一个字符大于第二个字符,返回1;如果小于,则返回-1.
int my_strcmp(const char *p1, const char *p2)
{
assert(p1 && p2);
while (*p1 == *p2)
{
if (*p1 == '\0')
return 0;
p1++;
p2++;
}
if (*p1 > *p2)
return 1;
else
return -1;
}
int main()
{
char *p1 = "abcd";
char *p2 = "abc";
printf("%d\n", my_strcmp);
system("pause");
return 0;
}
strstr的模拟实现
- strstr是用来在一个字符串中寻找字符串的,如果找到,则返回它在字符串的起始位置。
char *my_strstr(const char *str, const char *substr)
{
const char *s1 = str;
const char *s2 = substr;
const char *cur = str;
assert(str && substr);
while(*cur)
{
s1 = cur;
while ((*s1 == *s2) && (*s1 != '\0') && (*s2 != '\0'))
{
s1++;
s2++;
}
if (*s2 == '\0')
return cur;
cur++;
}
return NULL;
}
int main()
{
char *p1 = "abbbcde";
char *p2 = "bbc";
printf("%s\n", my_strstr(p1, p2));
system("pause");
return 0;
}
memcpy的模拟实现
- memcpy和strcpy都是可以拷贝字符串的,但两者有所差异,strcpy把字符串全部拷进去(包括’\0’),memcpy把指定的字节拷过去,所以它可以可字符型的,也可以拷贝整形的。
void *my_memcpy(void *dest, const void *src, size_t count)
{
void *ret = dest;
assert(dest && src);
while (count--)
{
*(char *)dest = *(char *)src;
src = (char *)src + 1;
dest = (char *)dest + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6 };
int arr2[] = { 7,8,9,0 };
my_memcpy(arr1, arr2, 12);
system("pause");
return 0;
}
memmove的模拟实现
- memmove是用来拷贝重叠的元素,思想和memcpy一样,只是在拷贝的时候要分清楚从前向后拷贝,还是从后向前拷贝。
void *my_memmove(void *dest, const void *src, size_t count)
{
void *ret = dest;
assert(dest && src);
if (dest < src)
{
while (count--)
{
*(char *)dest = *(char *)src;
src = (char *)src + 1;
dest = (char *)dest + 1;
}
}
else
{
while (count--)
{
*((char *)dest + count) = *((char *)src + count);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8 };
my_memmove(arr1, arr1 + 2, 16);
system("pause");
return 0;
}