前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >strlen,strcpy,stract,strcmp,strstr函数的模拟实现

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

作者头像
用户11039545
发布2024-03-28 17:47:58
870
发布2024-03-28 17:47:58
举报
文章被收录于专栏:c语言

strlen

方式一(计数器):

代码语言:javascript
复制
# 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;
}

方式二(迭代):

代码语言:javascript
复制
# 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;
}

方法三:

指针运算

代码语言:javascript
复制
# 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";是常量字符串,不可被修改。

代码语言:javascript
复制
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
}

第一次修改后:

代码语言:javascript
复制
void my_strcpy(char* dest, const char* src)
{    
    assert(src!=NULL);
    assert(dest!=NULL);
    while(*src!='\0')
    {
	*dest++ = *src++;//拷贝\0之前的内容
    }
    *dest = *src;//拷贝\0
}

第二次修改后:

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

代码语言:javascript
复制
void my_strcpy(char* dest, const char* src)
{    
    assert(src!=NULL);
    assert(dest!=NULL);
    while(*dest++ = *src++)
    {
	 ;
    }
}

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

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

代码语言:javascript
复制
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结尾,不然不知道什么时候结束。目标空间必须足够大且能够修改。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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;//找不到就返回空指针
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • strlen
  • strcpy
  • strcat
  • strcmp
  • strstr
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档