用C语言模拟实现各个函数

1.实现strstr

char *strstr( const char *string, const char *strCharSet );

功能:函数用于判断字符串strCharSet是否是strtring的子串。如果是,则该函数返回strCharSet在string中首次出现的地址;否则,返回NULL。

char *MyStrstr(const char *str1, const char *str2)
{
	const char *p = str1;//保存str1地址
	const char *start = p;//设立标志,起始位置
	const char *start1 = str2;
	assert(str1 != NULL&&str2 != NULL);
	while (*start != '\0')
	{
		while (*start!='\0'&&*start1!='\0'&&*start==*start1)
		{
			start++;
			start1++;
		}
		if (*start1 == '\0')//str2走完,说明找到了,返回str1起始位置
		{
			return p;
		}
		start1 = str2;//否则str2重新开始
		p++;//str1向后走一位作为起始标志
		start = p;
	}
	return NULL;//str1遍历完,依然没有找到,返回空值
}
int main()
{
    char *str1 = "abcdefg";
	char *str2 = "ccefg";
	const char *p = MyStrstr(str1, str2);
	printf("%s\n", p);
	system("pause");
	return 0;
}




在这里插入图片描述

2.实现strchr

char *strchr( const char *string, int c );

功能:查找字符串string中首次出现字符c的位置
说明:返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果string中不存在c则返回NULL。
返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL

char *MyStrchr(const char *str1, int c)
{
	assert(str1 != NULL);
	while (str1 != '\0')
	{
		if (*str1 == c)
		{
			return str1;
		}
		else
		{
			str1++;
		}
	}
	return NULL;
}
#include<string.h>
#include<assert.h>
int main()
{
	char str1[] = "abcd";
	char *str = MyStrchr(str1, 'c');
	printf("%s\n", str);
	system("pause");
	return 0;
}

3.strcmp

int strcmp( const char *string1, const char *string2 );

一 . 函数介绍
string1和string2可以使字符串常量或者字符串变量,返回值为整型
函数所用是比较两个字符串的大小
若string1>string2返回正数
若string1<string2返回负数
若string1=string2返回零
字符串的大小的比较是通过ASCII 码来比较
二. 函数实现
字符串相等时,并且指针同时指向’\0’返回零
如果str1先指向’\0’,则str2大
如果str2先指向’\0’,则str1大
字符串不同时,则比较ASCII码的大小

#include<assert.h>
#include<string.h>
int MyStrcmp(const char *str1, const char *str2)
{
	assert(str1 != NULL&&str2 != NULL);
	//对两个字符串进行断言
	while (*str1 == *str2)
	//字符相等时,并且都走到'\0'时,表示两字符串相等
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	//2.不相等
	if (*str1 > *str2)
	{
		return 1;
	}
	if (*str1 < *str2)
	{
		return -1;
	}
}
int main()
{
	char *str1 = "abcdef";
	char *str2 = "ab";
	int n = MyStrcmp(str1, str2);
	//若str1大返回正数1,若str2返回-1,若相等返回0
	printf("%d\n", n);
	system("pause");
	return 0;
}
int main()
{
	char *str1 = "abcdef";
	char *str2 = "ab";
	int n = strcmp(str1, str2);
	printf("%d\n", n);
	system("pause");
	return 0;
}

4.memcpy

void *memcpy( void *dest, const void *src, size_t count );

The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions.
memcpy函数将src的计数字节复制到dest。 如果源和目标重叠,则此函数不会确保在覆盖之前复制重叠区域中的原始源字节。 使用memmove处理重叠区域。
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void *MyMemcpy(void *str1, void *str2, int count)
{
	assert(str1 != NULL&&str2!=NULL);
	void *ret = str1;
	while (count--)
	{
		*(char *)str1 = *(char *)str2;
		((char *)str1)++;
		((char *)str2)++;
	}
	return ret;
}
int main()
{
	int i = 0;
	int str1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int str2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	MyMemcpy(str1 + 2, str1, 16);
	for (i = 0; i < 9; i++)
	{
		printf("%d ", str1[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}


运行结果:
在这里插入图片描述

5.实现memmove

void *memmove( void *dest, const void *src, size_t count );

memmove函数将字节的字节数从src复制到dest。 如果源区域和目标的某些区域重叠,则memmove可确保在覆盖之前复制重叠区域中的原始源字节。

void *MyMemmove(void *str1, void *str2, int count)
{
	assert(str1 != NULL&&str2 != NULL);
	if (str1 < str2)
	{
		while (count--)//从前往后赋值
		{
			*(char *)str1 = *(char *)str2;
			((char *)str1)++;
			((char *)str2)++;
		}
	}
	else
	{
		while (count--)//从后往前赋值
		{
			*((char *)str1 + count) = *((char *)str2 + count);
		}
	}
}
int main()
{
	int i = 0;
	int str1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	MyMemmove(str1 + 2, str1, 16);
	for (i = 0; i < 9; i++)
	{
		printf("%d ", str1[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}


运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值