[C语言]模拟实现strcpy/strncpy/strcat/strncat/strcmp/strncmp/strstr

1.模拟实现strcpy

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;">//strcpy
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strcpy(char* dst, char* src)
{
	assert(dst!=NULL&&src!=NULL);
	char* ret = dst;
	while ((*dst++ = *src++) != '\0')
		;
	return ret;
}
int main()
{
	char str1[] = "Hello World";
	char str2[40];
	my_strcpy(str2, str1);
	printf("%s\n", str2);
	system("pause");
	return 0;
}</span></span></span>

2.模拟实现strnpy

思路:利用count来控制复制次数,每次复制时,减减count

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;">//strncpy
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dst, char* src, int count)
{
	assert(dst != NULL&&src != NULL);
	char* ret = dst;
	while ((*dst++ = *src++) != '\0'&&count)
		count--;
	return ret;
}
int main()
{
	char str1[] = "Hello World";
	char str2[40] = "\0";
	char str3[40] = "\0";
	my_strncpy(str2, str1,sizeof(str1));
	my_strncpy(str3, str1, 5);
	printf("%s\n", str2);
	printf("%s\n", str3);
	system("pause");
	return 0;
}</span></span></span>

3.模拟实现strcat

思路:先遍历一遍dst,将源字符串指针走到\0,然后利用src作为循环条件,将src依次赋值给dst,就形成连接。

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;">//strcat
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strcat(char* dst, char* src)
{
	assert(dst != NULL&&src != NULL);
	char* ret = dst;
	while (*dst)
		dst++;
	while (*src)
	*dst++ = *src++;
	return ret;
}
int main()
{
	
	char str1[50] = "Hello";
	char str2[50] = " World";
	my_strcat(str1, str2);
	printf("%s\n", str1);
	system("pause");
	return 0;
}</span></span></span>



4.模拟实现strncat

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;">//strncat
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strncat(char* dst, char* src, int count)//利用count控制连接次数
{
	assert(dst != NULL&&src != NULL);
	char* ret = dst;

	while (*dst)
		dst++;
	while (*src&&count)
	{
		*dst++ = *src++;
		count--;
	}
	return ret;
}
int main()
{
	char str1[50] = "Hello";
	char str2[50] = " World";
	my_strncat(str1, str2,sizeof(str2));
	my_strncat(str1, str2, 3);
	printf("%s\n", str1);
	system("pause");
	return 0;
}</span></span>

5.模拟实现strcmp

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;">//strcmp
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL&&str2 != NULL);
	while (*str1==*str2)  //如果两个一直相等,两个指针就后移
	{
		str1++;
		str2++;
		if (*str1 == '\0'&&*str2 == '\0')//知道移动到结尾。
			return 0;
	}
	if (*str1>*str2)//两字符不相等,就进行比较
		return 1;//大于返回1
	else //小于  返回-1
		return -1;
}

int main()
{
	char* str1 = "aaaa";
	char* str2 = "aaaa";
	char* str3 = "aaaa";
	char* str4 = "bbb";
	char* str5 = "cc";
	char* str6 = "aaaa";
	int ret1 = my_strcmp(str1, str2);
	int ret2 = my_strcmp(str3, str4);
	int ret3 = my_strcmp(str5, str6);
	printf("%d\n", ret1);
	printf("%d\n", ret2);
	printf("%d\n", ret3);
	system("pause");
	return 0;
}</span></span>


6.模拟实现strncmp

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:18px;">//strncmp
#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* str1, const char* str2,int count)//利用count控制
{
	assert(str1 != NULL&&str2 != NULL);
	while (*str1 == *str2&&count--)   //如果两个相等,并且count不为0
	{
		str1++;
		str2++;
		if (count==0)  //如果count等于0,就说明比完了
			return 0;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main()
{
	char* str1 = "aaaa";
	char* str2 = "aaab";
	char* str3 = "aac";
	char* str4 = "aaaa";
	int ret1 = my_strncmp(str1, str2,3);
	int ret2 = my_strncmp(str3, str4,2);
	printf("%d\n", ret1);
	printf("%d\n", ret2);
	system("pause");
	return 0;
}</span></span>

7.模拟实现strstr

<span style="font-family:Microsoft YaHei;font-size:18px;">//strstr
#include <stdio.h>
#include <assert.h>

char *my_strstr(const char *str1, const char *str2)
{
	assert(str1);
	assert(str2);
	char *p = str1;  
	char *q = str2; 
	char *start;    
	while (*p)
	{
		start = p;  
		while (*p && *q && *p == *q)  
		{
			p++;
			q++;
		}
		if (*q == '\0')
		{
			return start;
		}
		p++;  //不匹配,str1由上一次的起始位置向后加1
	}
	return NULL;  //整体遍历完没有找到,返回空
}

int main()
{
	char *str1 = "abbbcdef";
	char *str2 = "bbcd";
	char *ret = my_strstr(str1, str2);
	printf("%s\n", ret);
	system("pause");
	return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值