字符串函数及其模拟实现(二)

strlen()

函数介绍
size_t strlen(const char * str);
1、字符串以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’)
2、参数指向的字符串必须要以’\0’结束
3、注意函数的返回值为size_t,是无符号的

模拟实现
#include<stdio.h>
#include<windows.h>

int my_strlen(const char * str)
{
	int count = 0;
	while (*str){
		count++;
		str++;
	}
	return count;
}

int my_strlen2(const char * str)
{
	if (*str == '\0'){
		return 0;
	}
	else{
		return 1 + my_strlen(str + 1);
	}
}

int my_strlen2(const char * str)
{
	char *p = str;
	while (*p != '\0'){
		p++;
	}
	return p - str;
}
int main()
{
	const char * str = "abcdefg";
	int len = my_strlen(str);
	printf("%d\n", len);

	system("pause");
	return 0;
}

strspy()

函数介绍
char * strcpy ( char * destination, const char * source );
复制字符串
将source指向的C字符串复制到destination指向的数组中,包括终止空字符(并在该点停止)。
为避免溢出,目标指向的数组大小应足够长,以包含与源相同的C字符串(包括终止空字符),并且不应在内存中与源重叠。

模拟实现
#include<stdio.h>
#include<Windows.h>
#include<assert.h>

char * my_strcpy(char *des, const char *src)
{
	char *ret = des;
	assert(des != NULL);
	assert(src != NULL);
	while (*des++ = *src++);
	return ret;
}

int main()
{
	const char * str1 = "abcdefg";
	char str2[20];
	my_strcpy(str2, str1);
	printf("%s\n", str2);

	system("pause");
	return 0;
}

strcat()

函数介绍
char * strcat ( char * destination, const char * source );
连接字符串
将源字符串的副本附加到目标字符串。在终止空字符目的地是由所述第一字符覆盖源,以及一个空字符被包括在由两者的在级联形成的新字符串的末尾目的地。
注意:目的地和来源不得重叠。

模拟实现
#include<stdio.h>
#include<windows.h>
#include<assert.h>

char * my_strcat(char *des, const char *src)
{
	char *ret = des;
	assert(des != NULL);
	assert(src != NULL);

	while (*des){
		des++;
	}
	while (*des++ = *src++);
	return ret;
}

int main()
{
	const char * str1 = "abcdefg";
	char str2[20] = "abcd";

	my_strcat(str2, str1);
	printf("%s\n", str2);

	system("pause");
	return 0;
}

strstr()

函数介绍
char * strstr ( const char * str1, const char * str2 );
找到子字符串
将指针返回到第一次出现STR2在STR1如果,或一个空指针STR2不是部分STR1。
匹配过程不包括终止空字符,但它会在那里停止。

#include<stdio.h>
#include<assert.h>
char * my_strstr(const char*str1,const char*str2)
{
	const char *s1 = str1;
	const char *s2 = str2;
    const char *cp = str1;
	assert(str1 != NULL);
	assert(str2 != NULL);

	if(*str2 == '\0')
		return (char*)str1;

	while(*cp)
	{
		s1 = cp;
		s2 = str2;
		
        while(*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if(*s2 == '\0')
			return (char *)cp;
		cp++;
	}
	return NULL;
}
int main()
{
	char *p1 = "bbc";
	char *p2 = "abbcdef";
	char *ret = my_strstr(p2,p1);
	printf("%s\n",ret);
	return 0;
}



THE END

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值