模拟实现:strlen,strcpy,strcat,strchr,ctrcmp,strstr

模拟实现几个str库函数的功能:

首先,应用的头文件如下:

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

主函数如下,为了观察结果更加清晰,我在代码里顺便分了一下显示区域,并且每个模拟实现的函数都与其对应的库函数结果进行了对比:


int main()
{
	char str1[] = { "abcdef" };
	char str2[30] = { "0" };
	char str3[30] = { "123456" };
	printf("str1=%s\nstr2=%s\nstr3=%s\n",str1,str2,str3);

	printf("************************************************\n");
	//My_strlen(str1);
	printf("My_strlen:\nMy_strlen1(str1):len(str)=%d\n", My_strlen1(str1));
	printf("My_strlen2(str1):len(str)=%d\n", My_strlen2(str1));
	printf("My_strlen3(str1):len(str)=%d\n", My_strlen3(str1));
	printf("strlen(str1):len(str)=%d\n", strlen(str1));
	printf("************************************************\n");

	//My_strcpy(str2, str1);
	printf("My_strcpy:\nMy_strcpy(str2,str1):str2=%s\n", My_strcpy(str2, str1));
	printf("strcpy(str2,str1):str2=%s\n", strcpy(str2, str1));
	printf("************************************************\n");

	//My_strcat(str3, str1);
	printf("My_strcat:\nMy_strcat(str3,str1):str3=%s\n", My_strcat(str3, str1));
	printf("strcat(str3,str1):str3=%s   ", strcat(str3, str1));
	printf("(在My_strcat的结果的基础上再进行一次strcat!)\n");
	printf("************************************************\n");

	//My_strstr(str1,"bcd");
	printf("My_strstr:\nMy_strstr(str1,'bcd'):%s\n", My_strstr(str1, "bcd"));
	printf("strstr(str1,'bcd'):%s\n", strstr(str1, "bcd"));
	printf("************************************************\n");

	//My_strchr(str1,'d');
	printf("My_strchr:\nMy_strchr(str1, 'd'):%s\n", My_strchr(str1, 'd'));
	printf("My_strchr(str1, 'd'):%s\n", My_strchr(str1, 'h'));
	printf("strchr(str1, 'h'):%s\n", strchr(str1, 'd'));
	printf("strchr(str1, 'h'):%s\n", strchr(str1, 'h'));
	printf("************************************************\n");

	//My_strcmp(str1,str3);
	printf("My_strcmp:\nMy_strcmp(str1,str3):%d\n", My_strcmp(str3, str1));
	printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str3));
	printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str2)); 
    //str2已被修改,此时str2=str1
	printf("strcmp(str1,str3):%d\n", strcmp(str3, str1));
	printf("strcmp(str1,str3):%d\n", strcmp(str1, str3));
	printf("strcmp(str1,str3):%d\n", strcmp(str1, str2));   //str2已被修改,此时str2=str1
	printf("************************************************\n");

	system("pause");
	return 0;
}

各部位代码:

1·strlen(求字符串长度,这里用了三种不同的方法):

int My_strlen1(char *str)     //方法1:计数器求strlen
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int My_strlen2(char *str)      //方法2:递归方法求strlen
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + My_strlen2(str+1);
}
int My_strlen3(char *str)           //方法3:尾指针-头指针方法求strlen
{
	assert(str);
	char *p = str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;
}

2·strcpy(字符串拷贝):

char *My_strcpy(char *dst, const char *src)
{
	assert(dst);
	assert(src);
	char *ret = dst;
	/*while (*dst=*src)
	{
		dst++;
		src++;
	}*/

	while (*dst++ = *src++)
	{
		;
	}
	//稍作改进
	return ret;
}

3·strcat(字符串追加):

char *My_strcat(char *dst, const char *src)
{
	assert(dst);
	assert(src);
	char *ret = dst;
	while (*dst)
	{
		dst++;
	}
	while (*src)
	{
		*dst =*src;
		src++; 
		dst++;
	}
	return ret;
}

4·strstr(子字符串查找):

char *My_strstr(const char *str1, const char *str2)
{
	assert(str1);
	assert(str2);
	char *p_str1 = (char *)str1;
	char *p_str2 = (char *)str2;
	char *pc_str1=NULL;
	if (*str2=='\0')
	{
		return NULL;
	}
	while (*p_str1)
	{
		pc_str1 = p_str1;
		p_str2 = (char *)str2;
		while ((*pc_str1 == *p_str2)&&(*p_str2)&&(*pc_str1))
		{
			pc_str1++;
			p_str2++;
		}
		if (*p_str2 == '\0')
		{
			return p_str1;
		}
		p_str1++;
	}


	return NULL;
}

5·strchr(字符查找):

char *My_strchr(char *str, int p)   //字符可转为ASCLL值,故参数2可为int类型
{
	assert(str);
	assert(p);
	char *ret = str;
	while (*str)
	{
		if (*str == p)
			return str;
		else
			str++;
	}
	return NULL;
}

6.strcmp(字符串比较):

int My_strcmp(const char *str1, const char* str2)   
//若参数1>参数2,返回1;若参数1<参数2返回-1;若相等,返回0
{
	assert(str1);
	assert(str2);
	while (*str1)
	{
		if (*str1 == *str2)
		{
			str1++;
			str2++;
		}
		else
			break;		
	}
	if ( (*(unsigned char *)str1 - *(unsigned char *)str2) > 0)
		return 1;
	else if ((*(unsigned char *)str1 - *(unsigned char *)str2) < 0)
		return -1;
	return 0;
}

显示结果如下:

经过验证,功能与库函数功能基本一致。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值