模拟实现常见的字符串函数

1.Strcpy

strcpy是把含有’\0’结束符的字符串拷贝到另一个地址空间,返回值的类型为char*

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

char* Strcpy(char* des, const char* src)
{
	assert(src != NULL);
	int i = 0;
	for (i = 0; src[i] != '\0'; ++i)
	{
		des[i] = src[i];
	}
	des[i] = '\0';
	return des;
	
}
int main()
{
	char des[]="";//给成空字符串
	char src[] = "lwcunwang";
	printf("%s",Strcpy(des, src));
	system("pause");
	return 0;
}

2.Strcat

拼接字符串

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

char* Strcat(char* des, const char* src)
{
	assert(des!=NULL&&src != NULL);
	int i = 0;
	for (i = 0; des[i] != '\0'; ++i);//注意此时for只是找到目标字符串的最有一个元素的位置
	for (int j = 0; src[j] != '\0'; ++j, ++i)
		{
			des[i] = src[j];
		}
		
	des[i] = '\0';
	return des;
	
}
int main()
{
	char des[]="henniubi";
	char src[] = "cunwang";
	printf("%s",Strcat(des, src));//输出结果henniubicunwang
	system("pause");
	return 0;
}

3.Strstr

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
例如:str1=lwcun wang; str2=wa;则输出为wang;

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

char* Strstr(char* str1, char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* i = str1;
	char* j = NULL;
	while (*i != '\0')
	{
		j = str2;
		char* k = i;//i记录第一次相等时的位置
		while (*k!='\0' && *j != '\0' && *k == *j)
		{
			++k;
			++j;
		}
		if (*j == '\0')
		{
			return i;//返回i地址,后面一连串的字符串都可以返回
		}
		++i;
	}
	return NULL;
}

int main()
{
	char str1[] = "lw cun wang";
	char str2[] = "wa";
	printf("%s", Strstr(str1,str2));
	system("pause");
	return 0;
}

4.Strchr

strchr(des,‘a’);返回第一个与字符a相等字符下标

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

char* Strchr(const char* des, char s) {
	assert(des != NULL);
	char* p = des;
	for (; *p != '\0'; p++) {
		if (*p == s) {
			break;
		}
	}
	return p;

}
int main()
{
	char* des = "lw cun wang";
	char s = 'a';
	char* ret = Strchr(des, 'a');
	printf("%d", ret - des + 1);
	system("pause");
	return 0;
}

Memcpy

函数原型:void *memcpy(void *destin, void *source, unsigned n);
从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中;

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
void* Memcpy(void* des, void* src, size_t n)//n表示拷贝多少个字节
{
	assert(des != NULL && src != NULL);
	char* dest = (char*)des;//定义一个字符型指针,然后将des的地址传给dest
	char* srct = (char*)src;
	for (size_t i = 0; i < n; ++i)
	{
		dest[i] = srct[i];
	}
	return des;
}

int main()
{
	char des[1024]= "";
	char src[1024] = "lwcunwang";
	
	printf("%s",Memcpy(des, src, 3));//lwc

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记得多喝热水…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值