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;//找不到就返回空指针
}
相关文章
|
7月前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
137 1
|
2月前
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
43 0
|
7月前
|
存储 编译器 C语言
strlen函数详解
strlen函数详解
308 2
strcpy与strncpy的模拟与实现
strcpy与strncpy的模拟与实现
53 0
|
C语言
自己实现strcpy和strlen函数
自己实现strcpy和strlen函数
97 0
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
57 0
strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现
🐰strlen 🐰模拟strlen 🐰strcpy 🐰模拟strcpy 🐰strcat 🐰模拟strcat 🐰strcmp 🐰模拟strcmp 🐰strncpy 🐰strncat 🐰strncmp 🐰strstr 🐰模拟strstr
|
编译器
strtok,strerror,memcpy,memmove,memcmp,memset详细解析及模拟实现
🐰strtok 🐰strerror 🐰memcpy 🐰模拟实现memcpy 🐰memmove 🐰模拟实现memmove 🐰memcmp 🐰memset
strcmp函数详解
如果字符串不一样,并且字符串1>字符串2,则返回值>0.相反返回值小于零。
377 0