字符串训练(二)模拟实现strstr strncpm strncat strncpy函数

1、模拟实现strncat函数

//模拟实现strncat
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char * mystrncat(char *dest, const char *src, int n)
{
	char *destbak = dest;
	assert(NULL != dest && NULL != src  );
	while ( '\0' != *dest)
	{
		dest++;
	}
	while (n > 0 && ('\0' != *src))
	{
		*dest++ = *src++;  //这句话放在while循环中,最后面也要加上*dest = '\0'这条语句。
		n--;
	}
	*dest = '\0';
	return destbak;
}
int main()
{
	char array[100] = "hello world";
	char *p = "abcdef";
	mystrncat(array, p,10);
	printf("array = %s\n",array);
	printf("hello...\n");
	system("pause");
	return 0;
}


2、模拟实现strncpy函数

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char * mystrncpy(char *dest, const char *src, int n)
{
	char *destbak = NULL;
	int i = 0;
	assert(NULL != dest && NULL != src);
	for (i = 0 ; i < n; i++)      //从这可以看出当拷贝的字符数没有\0时,这个函数不会加上\0,所以使用这个函数要小心\0.
	{
		*dest = *src;
		if ('\0' == *src )
		{
			dest++;
		}
		else
		{
			dest++;
			src++;
		}
	}
	return destbak;
}
int main()
{
	char array[100] = { 0 };
	char *p = "abcdef";
	mystrncpy(array, p,10);
	printf("array = %s\n",array);
	printf("hello...\n");
	system("pause");
	return 0;
}



3、模拟实现strncmp函数

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
int mystrncmp(const char *str1, const char *str2, int n)
{
	assert(NULL != str1 && NULL != str2);
	while (n > 0 && *str1 == *str2)
	{
		if ('\0' == *str1)
		{
			return 0;
		}
		str1++;
		str2++;
		n--;
	}
	if (0 == n )
	{
		return 0;
	}
	if (*str1 > *str2)
	{
		return 1;
	}
	else
		return -1;
}
int main()
{
	char *p = "abjdidfe";
	char *p2 = "abdidfe";
	int ret = 0;
	ret = strncmp(p,p2,3);
	if (0 == ret)
	{
		printf("p1 = p2\n");
	}
	else if(ret > 0)
		printf("p1 > p2\n");
	else 
		printf("p1 < p2\n");
	printf("hello...\n");
	system("pause");
	return 0;
}



4、模拟实现strstr函数(两种方法)

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
//标志法
char *mystrstr1(const char *string, const char *strCharSet)
{
	assert(NULL != string && NULL != strCharSet);
	if('\0' ==*strCharSet)   //当要找的是空串的时候,特殊处理。
	{
		return (char *)string;
	}
	while ( '\0' != *string )
	{
		int flag = 1;
		const char *stringbak = string;
		const char *strCharSetbak = strCharSet;
		while ('\0' !=  *strCharSetbak)
		{
			if (*stringbak != *strCharSetbak)
			{
				flag = 0;
				break;
			}
			else
			{
				stringbak++;
				strCharSetbak++;
			}
		}
		if (1 == flag)
		{
			return (char*)string;
		}
		string++;
	}
	return NULL;
}
//方法二:利用字符串的结束标志去写。
char *mystrstr2(const char *string, const char *strCharSet)
{
	assert(NULL != string && NULL != strCharSet);
	if('\0' ==*strCharSet)   //当要找的是空串的时候,特殊处理。
	{
		return (char *)string;
	}
	while ( '\0' != *string )
	{
	
		const char *stringbak = string;
		const char *strCharSetbak = strCharSet;
		/*while ('\0' !=  *strCharSetbak)
		{
			if (*stringbak != *strCharSetbak)
			{
				break;
			}
			else
			{
				stringbak++;
				strCharSetbak++;
			}
		}*/
		while (('\0' !=  *strCharSetbak) && (*stringbak == *strCharSetbak) )  //上面注释的简洁版本。
		{
			stringbak++;
			strCharSetbak++;
		}
		if ('\0' == *strCharSetbak)
		{
			return (char*)string;
		}
		string++;
	}
	return NULL;
}
int main()
{
	char *p1 = "abbcdef";
	char *p2 = "bbc";
	printf("p2 = %s\n",mystrstr1(p1,p2));
	printf("p2 = %s\n",mystrstr2(p1,p2));
	printf("hello...\n");
	system("pause");
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值