strlen,strcpy,stract,strcmp,strstr函数的模拟实现

简介: strlen,strcpy,stract,strcmp,strstr函数的模拟实现

strlen

方式一(计数器):

# define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<assert.h>
int my_strlen(const char*str)
{
  int count = 0;
  assert(str);
  while (*str)
  {
    str++;
    count++;
  }
  return count;
}
int main()
{
  char str[] = "abcdf";
  printf("%d ", my_strlen(str));
  return 0;
}

方式二(迭代):

# define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<assert.h>
int my_strlen(const char*str)
{
  int count = 0;
  assert(str);
  if (*str == '\0')
  {
    return 0;
  }
  else return 1 + my_strlen(str + 1);
}
int main()
{
  char str[] = "abcdf";
  printf("%d ", my_strlen(str));
  return 0;
}

方法三:

指针运算

# define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<assert.h>
int my_strlen(char*s)
{
  assert(s);
  char* p = s;
  while (*p != '\0')
    p++;
    return p-s;
  }
  
int main()
{
  char str[] = "abcdf";
  printf("%d ", my_strlen(str));
  return 0;
}

strcpy

原字符串里必须有‘\0’。

会将源字符串中的 '\0' 拷⻉到⽬标空间。

目标空间必须可修改:char*p="xxxxxx";是常量字符串,不可被修改。

void my_strcpy(char* dest, const char* src)
{    
    assert(src!=NULL);
    assert(dest!=NULL);
    while(*src!='\0')
    {
  *dest = *src;//拷贝\0之前的内容
  dest++;
  src++;
    }
    *dest = *src;//拷贝\0
}

第一次修改后:

void my_strcpy(char* dest, const char* src)
{    
    assert(src!=NULL);
    assert(dest!=NULL);
    while(*src!='\0')
    {
  *dest++ = *src++;//拷贝\0之前的内容
    }
    *dest = *src;//拷贝\0
}

第二次修改后:

后置++的优先级高,但是结果是后产生的。

void my_strcpy(char* dest, const char* src)
{    
    assert(src!=NULL);
    assert(dest!=NULL);
    while(*dest++ = *src++)
    {
   ;
    }
}

\0的asc码值为0,拷不过去。

模拟实现返回类型为char,对本代码再次进行修改:

char my_strcpy(char* dest, const char* src)
{    
    assert(src!=NULL);
    assert(dest!=NULL);
    char*ret=dest;
    while(*dest++ = *src++)
    {
   ;
    }
    return ret;//返回目标空间的起始地址
}

 

strcat

用来连接字符串

首先找到目标空间的\0(如果没有,不知道追加从哪儿开始),再拷贝数据。源字符串也必须以\0结尾,不然不知道什么时候结束。目标空间必须足够大且能够修改。

char* my_strcat(char* dest, const char* src)
{
  char* ret = dest;//记录原字符串的头指针
  assert(dest != NULL);
  assert(src != NULL);
  while (*dest)//找到原字符串\0的下一位
  {
    dest++;
  }
  while ((*dest++ = *src++))
  {
    ;
  }
  return ret;
}

strcmp

int my_strcmp(const char* str1, const char* str2)
{
  int ret = 0;
  assert(src != NULL);
  assert(dest != NULL);
  while (*str1 == *str2)
  {
    if (*str1 == '\0')
      return 0;
    str1++;
    str2++;
  }
  return *str1 - *str2;
}

strstr

# define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{
  const char* s1 = NULL;
  const char* s2 = NULL;
  const char* cur = str1;
  while (*cur)
  {
    s1 = cur;
    s2 = cur;
    while(*s1!='\0'&&*s2!='\0'&&*s1 == *s2)
    {
      s1++;
      s2++;
    }
        if(*s2=='\0')
        {
            return cur;
        }
    cur++;
  }
    return NULL;//找不到就返回空指针
}
相关文章
|
NoSQL Linux
gdb调试产生code文件以及遇到的“file format not recognized”问题解决
gdb调试产生code文件以及遇到的“file format not recognized”问题解决
1641 0
|
6月前
|
人工智能 前端开发 Java
用git rebase命令合并开发阶段中多条commit提交记录
通过 `git rebase`,可以合并多个提交记录,使开发历史更简洁清晰。操作分为 6 步:查看提交历史 (`git log --oneline`)、设置需合并的提交数 (`git rebase -i HEAD~N`)、修改动作标识为 `s`(squash)、保存退出编辑、调整提交信息、强制推送至远程仓库 (`git push -f`)。此方法适合清理本地无关提交,但若有团队协作或冲突风险,需谨慎使用以避免问题。
825 60
|
10月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
587 0
|
7月前
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
Python
面向对象编程
【8月更文挑战第29天】面向对象编程。
84 3
|
Unix
全网首发:configure: error: cannot guess build type; you must specify one
全网首发:configure: error: cannot guess build type; you must specify one
957 0
|
移动开发 前端开发
flowable多对并发网关跳转的分析
flowable多对并发网关跳转的分析
201 0
|
算法 数据挖掘 定位技术
GEE 案例——如何计算sentinel-2中每一个单景影像的波段的DN值并绘制直方图
GEE 案例——如何计算sentinel-2中每一个单景影像的波段的DN值并绘制直方图
232 5
|
SQL 关系型数据库 Apache
Microsoft SQL Server 迁移到 PostgreSQL 利器:Babelfish
Babelfish for PostgreSQL 加速了将 Microsoft SQL Server 应用程序迁移到 PostgreSQL 的旅程。Babelfish for PostgreSQL 是一个开源项目,可在 Apache 2.0 和 PostgreSQL 许可下使用。它使 PostgreSQL 能够理解来自 Microsoft SQL Server 编写的应用程序的查询。Babelfish 了解 SQL Server 有线协议和 Microsoft SQL Server 查询语言 T-SQL,此您不必切换数据库驱动程序或重新编写所有应用程序查询。
609 0
|
C++
关于无法打开lib文件问题或无法解析问题解决办法
关于无法打开lib文件问题或无法解析问题解决办法
1397 0