本文只列举出常见的7个库函数的模拟,如果有错误或者有问题,可以联系博主,欢迎指导。
1.模拟实现strlen(求字符串长度)
(1)
int my_strlen(const char *p)//计数器的方式 { int count = 0; assert(p != 0); while (*p != '\0') { count++; p++; } return count; }
(2)my_strlen(const char *str) //指针的方式
{
const char *start = str;
while (*str != '\0')
{
str++;
}
return str - start;
//为了简洁也可以用下面这种方式
/*while (*str++)
{
;
}
return str - start-1;*/
}
(3)
my_strlen( const char *p)//函数递归的方式
{
assert(p != 0);
if (*p == '\0')
return 0;
else
{
return 1+my_strlen(p+1);
}
}
int main()
{
int len = my_strlen("abcdef");
printf("%d\n", len);
return 0;
}
2.模拟strcat -- 字符串追加函数
char* my_strcat(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
while (*dest != '\0')
dest++;
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char arr[20] = "hello ";
my_strcat(arr, "world");
printf("%s\n", arr);
return 0;
}
3.模拟实现字符串拷贝函数strcpy
char* my_strcpy(char *dest,const char *src)//目标指针
//char* 链式访问 把一个函数的返回值作为另一个函数的参数
{
char*ret = dest;
assert(dest != null);//断言
assert(src != null);//断言
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[10] = "abcdefghi";
//strcpy(arr, "hello");
char *p = null;
printf("%s\n", my_strcpy(arr, "hello"));
return 0;
}
4.模拟实现strstr函数--- 从一个字符串里找另一个字符串
my_strstr(const char*str, const char*substr)
{
assert(str != NULL);
assert(substr != NULL);
const char *s1;
const char *s2;
while (*str != '\0')
{
s1 = str;
s2 = substr;
if (*substr =='\0')
return (char *)str;
while (*s1 && *s2 &&*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char *)str;
}
str++;
}
return NULL;
}
int main()
{
char arr1[10] = "abbbcde";
char arr2[10] = "bcdf";
char* ret=my_strstr(arr1, arr2);
if (ret !=NULL )
printf("找到了:%s\n",ret);
else
printf("没找到\n");
return 0;
}
5.模拟实现strcmp函数--- 字符串比较
my_strcmp(const char *str1, const char *str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str1 == *str2) { if (*str1 == '\0') { return 0; } str1++; str2++; } if (*str1 > *str2) return 1; else return -1; //或者不用输出正负1,只需要知道正负,可以直接输出正负数,则可以简化如下
// return *str1-*str2; } int main() { char *str1 = "abdsdafad"; char *str2 = "abdsdafa"; int ret = my_strcmp(str1, str2); printf("%d\n", ret); return 0; }
6.模拟memcpy函数--内存拷贝
void* my_memcpy(void *dest, const void *src, int count)
{
void *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (count--)
{
*(char*)dest = *(const char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
char arr1[10] = { 0 };
char arr2[20] = "abcdfef";
int arr4[10] = { 0 };
int arr3[10] = { 1,23,45,68,99 };
my_memcpy(arr2, arr1, 10);
my_memcpy(arr4, arr3, 40);
return 0;
}
7.模拟memmove函数--内存拷贝(专门处理重叠的情况)
void my_memmove(void *dest, const void*src, int count) {
assert(dest!=NULL);
assert(src!=NULL); if (dest < src) { //左->右 while (count--) { *(char *)dest = *(char*)src; ++(char *)dest; ++(char *)src; } } else { //右->左 while (count--) { *((char*)dest + count) = *((char*)src + count); } } } int main() { int arr1[10] = { 1, 2, 3, 4, 5, 7, 8, 9, 0 }; my_memmove(arr1+4, arr1 , 16); return 0; }
如果还有不理解的地方,可以联系博主,或者可以打开原始库函数,了解源库函数的过程,以加深了解。