你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)

简介: 你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)


我们知道包含string.h头文件后,就可以使用strlen和strcpy这两个库函数,strlen是用来求字符串的长度,strcpy是将一个要复制的字符串复制到另一个目标里,接下来我们将模拟实现他们。


目录


# strlen的模拟实现

# strcpy的模拟实现


# strlen的模拟实现


#include <stdio.h>
size_t my_strlen(const char* p)     //const 是为了不使字符串被修改
{
                                    //size_t 是无符号整数unsigned int
                                    //       因为没有负数的字符串,所以
                                    //       用他作为返回值
  int count = 0;
  while (*p++ != '\0')
  {
    count++;
  }
  return count;
}
int main()
{
  char str[] = "Today is a good day";
  int ret = my_strlen(str);
  printf("%d", ret);
  return 0;
}

这只是其中一种方法,接下来还有两种方法 ,分别为指针减指针,递归


1.指针减指针

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
size_t p_p_strlen(char* arr);
int main()
{
  char arr[] = "nishishabima?";
  printf("%d", p_p_strlen(arr));
  return 0;
}
size_t p_p_strlen(char* arr)
{
  char* p1 = arr;
  char* p2 = arr;
  while (*p2++ != '\0')
  {
    ;
  }
  return p2 - p1 -1;    //最后p2还要++,所以要减1
}

2.递归

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
size_t destrlen(char* arr);
int main()
{
  char arr[] = "nishishabima?";
  printf("%d\n", destrlen(arr));
  return 0;
}
size_t destrlen(char* arr)
{
  if (*arr == '\0')
    return 0;
  else
  {
    return 1 + destrlen(arr + 1);
  }
}


# strcpy的模拟实现


#include <stdio.h>
char* my_strcpy(char* aim, const char* str)  //const同理
{
  assert(aim && str);    //断言判断一手,防止为空(NULL)
  char* cur = aim;
  while (*aim++ = *str++)
  {
    ;
  }
  *aim = '\0';     //不加'\0'的话,打印时越界打印,直到遇见\0
  return cur;
}
int main()
{
  char str[] = "Today is a good day";
  char aim[30];
  my_strcpy(aim, str);
  printf("%s", aim);
  return 0;
}


这个代码还可以改造一下,变得简洁一点并做优化

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char *aim, const char *str)  //const同理
{
    assert(aim && str);    //断言判断一手,防止为空(NULL)
  while (*aim++ = *str++)
  {
    ;
  }
  *aim = '\0';     //不加'\0'的话,打印时越界打印,直到遇见\0
  return aim;
}
int main()
{
  char str[] = "Today is a good day";
  char aim[20];
  my_strcpy(aim, str);
  printf("%s", aim);
  return 0;
}
目录
相关文章
|
1月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
5月前
|
C语言
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
31 1
|
5月前
|
C语言
C 语言关于sizeof() 和 strlen()区别?
C 语言关于sizeof() 和 strlen()区别?
36 2
|
5月前
|
C语言
【C语言基础篇】字符串处理函数(二)strcpy的介绍及模拟实现
【C语言基础篇】字符串处理函数(二)strcpy的介绍及模拟实现
|
5月前
|
C语言
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现
|
5月前
|
C语言
C语言strcpy函数用法
C语言strcpy函数用法
|
5月前
|
C语言
C语言——oj刷题——模拟实现库函数strlen
C语言——oj刷题——模拟实现库函数strlen
38 0
|
6月前
|
C语言
C语言(8)----长度计算方法:sizeof与strlen的对比
C语言(8)----长度计算方法:sizeof与strlen的对比
38 0
|
6月前
|
程序员 C语言
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
41 0
|
6月前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(下)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
26 0