库函数的模拟实现

简介: 库函数的模拟实现

1.模拟实现strlen

模拟实现strlen函数有三种基本方式:

方式1:计数器方式

#include<stdio.h>
int my_strlen(const char* str)
{
  int count = 0;
  while (*str)
  {
    count++;
    str++;
  }
  return count;
}

方式2:不能创建临时变量计数器

1. #include<stdio.h>
2. int my_strlen(const char* str)
3. {
4.  if (*str == '\0')
5.    return 0;
6.  else
7.    return 1 + my_strlen(str + 1);
8. }

方式3:指针-指针的方式

1. #include<stdio.h>
2. int my_strlen(char* s)
3. {
4.  char* p = s;
5.  while (*p != ‘\0’)
6.    p++;
7.  return p - s;
8. }

2.模拟实现strcpy

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src)
{
  char* ret = dest;
  assert(dest && src);
  while (*dest++ = *src++)
  {
    ;
  }
  return ret;
}
int main()
{
  char arr1[20] = { 0 };
  char arr2[] = "abc";
  my_strcpy(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}


my_strcpy这个函数的返回值是char*,参数是两个char*的指针,但是第二个参数也就是源字符串是不需要改动的,所以加上const限制一下。


首先我们用while循环,将*src找到的字符存放到*dest里面去,只要这个字符不是\0,这个循环就还是会执行,然后使用后置++,跳过一个字符。我们在进入while循环之前使用assert进行断言一下,保证dest和src不为NULL。


strcpy在库函数里面的规定的返回值是目标空间的起始地址,所以先用char*的指针保存一下dest的起始地址,最后返回ret。

3 模拟实现strcat

#include<stdio.h>
#include<assert.h>
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] = "abc";
  char arr2[] = "def";
  my_strcat(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}

第一步我们先找到目标空间的末尾,也就是找到\0,第二步进行数据追加。

用第一个while循环找到目标空间的末尾,再用第二个while循环进行数据追加,追加的过程和strcpy是一样的。

4 模拟实现strcmp

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
  assert(str1 && str2);
  while (*str1 == *str2)
  {
    str1++;
    str2++;
  }
  if (*str1 > *str2)
    return 1;
  else
    return -1;
}
int main()
{
  char arr1[] = "abz";
  char arr2[] = "abq";
  if (my_strcmp(arr1, arr2) > 0)
  {
    printf(">\n");
  }
  else
  {
    printf("<=\n");
  }
  return 0;
}

库函数strcmp的返回值是0,<0,>0,所以返回值为int,因为两个参数都不需要修改,所以使用const限制一下,再用assert断言一下。先写一个while函数判断字符是否相同,相同则++进行下一个字符的比较,如果不相同则进入if,判断是>还是<,>则返回1,否则返回-1。

5.模拟实现strstr

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
const char* my_strstr(const char* str1, const char* str2)
{
  const char* cp;//记录开始匹配的位置
  const char* s1;//遍历str1指向的字符串
  const char* s2;//遍历str2指向的字符串
  assert(str1 && str2);
  if (*str2 == '\0')
    return str1;
  cp = str1;
  while (*cp)
  {
    s1 = cp;
    s2 = str2;
    while (*s1 && *s2 && *s1 == *s2)
    {
      s1++;
      s2++;
    }
    if (*s2 == '\0')
      return cp;
    cp++;
  }
  return NULL;
}
int main()
{
  char arr1[] = "abbbcdef";
  char arr2[] = "bbc";
  const char* ret = my_strstr(arr1, arr2);
  if (ret == NULL)
  {
    printf("找不到\n");
  }
  else
  {
    printf("%s\n", ret);
  }
  return 0;
}

首先我们创建一个指针cp,让cp记录开始匹配的位置。再创建一个指针s1,遍历str1指向的字符串。再创建一个指针s2,遍历str2指向的字符串。所以cp一开始指向的就是str1的起始位置,所以使用while循环,如果str1是NIULL就不用找了,直接返回NULL。如果不是空指针,则进入循环,将cp赋给s1,str2赋给s2。再使用一个while循环,如果*s1和*s2都不为空指针且*s1==*s2的话则进入while循环,然后s1++,s2++,判断下一个字符是否相等,如果出现了不相等的情况,则cp++,从str1的下一个字符开始判断。用if判断如果s2++出现了等于\0的情况,那么就是全部找到了,这个时候就返回cp就行了。当s1为\0的时候也是返回NUL的。


相关文章
|
7月前
|
C语言
模拟实现C语言中经典库函数,字符相关的函数与内存相关的函数
模拟实现C语言中经典库函数,字符相关的函数与内存相关的函数
模拟实现C语言中经典库函数,字符相关的函数与内存相关的函数
|
C语言
C语言常见库函数的模拟实现
C语言常见库函数的模拟实现
61 0
|
编译器 程序员 C语言
代码能跑起来就够了吗【代码优化/模拟实现库函数strcpy()/C语言】
代码能跑起来就够了吗【代码优化/模拟实现库函数strcpy()/C语言】
56 0
|
C语言
模拟库函数strcpy
关于库函数strcpy()的详细内容,跳转文章:《C语言:字符串拷贝函数strcpy()》
35 0
|
7月前
|
C语言 存储
C语言—部分库函数的模拟实现
C语言—部分库函数的模拟实现
|
7月前
|
算法
库函数讲解及模拟实现库函数
库函数讲解及模拟实现库函数
29 0
关于C库函数的一些模拟实现以及讲解思考
关于C库函数的一些模拟实现以及讲解思考
关于C库函数的一些模拟实现以及讲解思考
模拟实现库函数,strtsr,memmove.
<1>主页:C语言的前男友 <2>知识讲解:模拟实现 库函数 strstr,memmove <3>创作者:C语言的前男友 <4>开发环境:Visual Studio 2022 <5>前言:学习了strstr,memnove等库里面的内存相关的函数,功能非常的强大。今天我们来模拟实现一下。
模拟实现库函数strlen
模拟实现库函数strlen
30 0
模拟实现一些库函数(1)(上)
模拟实现一些库函数(1)
24 0