字符串函数

目录

前言

一、strlen的使用和模拟实现

1、函数的声明

2、注意事项

3、模拟实现

二、strcpy的使用和模拟实现

1、函数声明

2、注意事项

3、模拟实现

三、 strcat的使用和模拟实现

1、函数声明

2、注意事项

3、模拟实现

四、strcmp的使用和实现

1、函数声明

2、判断依据

3、模拟实现

五、strstr的使用与实现

1、函数的声明

2、返回值

3、模拟实现

总结


前言

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。

一、strlen的使用和模拟实现

1、函数的声明

size_t strlen ( const char * str );

2、注意事项

1.strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
2.参数指向的字符串必须要以 '\0' 结束。
3.注意函数的返回值为size_t,是无符号的

3、模拟实现

//计数器⽅式
int my_strlen(const char * str)
{
    int count = 0;
    assert(str);
    while(*str)
    {
        count++;
        str++;
    }
    return count;
}
//不创建临时变量计数器
int my_strlen(const char * str)
{
    assert(str);
    if(*str == '\0')
        return 0;
    else
    return 1+my_strlen(str+1);
}
//指针-指针的⽅式
int my_strlen(char *s)
{
    assert(str);
    char *p = s;
    while(*p != ‘\0’ )
    p++;
    return p-s;
}

二、strcpy的使用和模拟实现

1、函数声明

char* strcpy(char * destination, const char * source );

2、注意事项

1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可修改。

3、模拟实现

char* my_strcy(char* des, const char* sor)
{
	assert(des);
	assert(sor);
	char* ret = des;//将首字符地址先拷贝下来
	while ((*des++ = *sor++))
		;
	return ret;//不可返回des,因为des已经不指向首元素地址。
}
int main()
{
	char arr1[30];
	char arr2[] = "asdfaskdf";
	printf("%s", my_strcy(arr1, arr2));
}

三、 strcat的使用和模拟实现

1、函数声明

char *strcat(char *dest, const char *src);

2、注意事项

1.源字符串必须以 '\0' 结束。
2.目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
3.目标空间必须有足够的大,能容纳下追加的内容。
4.目标空间必须可修改。

3、模拟实现

char* my_stract(char* des, const char* sor)
{
	assert(des);
	assert(sor);
	char* ret = des;
	while (*des)//一定要保证跳到\0的后面那个空间
	{
		des++;
	}
	while ((*des++ = *sor++))//不能写成前置++
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[30] = { "asdfasdf" };//保证被接数组有足够的空间
	char arr2[] = { "fasfasd" };
	printf("%s", my_stract(arr1, arr2));
	return 0;
}

四、strcmp的使用和实现

1、函数声明

int strcmp(const char *str1, const char *str2)

2、判断依据

第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字
比较的是字符串中对应位置上字符ASCII码值的大小。与字符串长度无关。

3、模拟实现

int my_strcmp(const char* arr1, const char* arr2)
{
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')//不用担心arr1先到\0的情况,如果arr1先到\0,跳出循环
			return 0;//if一定比++早
		arr1++;
		arr2++;
	}
	return *arr1 - *arr2;
}
int main()
{
	char arr1[] = { "asdkfka" };
	char arr2[] = { "fdfsan" };
	int  ret = my_strcmp(arr1, arr2);
	printf("%d", ret);
	return 0;
}

五、strstr的使用与实现

1、函数的声明

char * strstr ( const char * str1, const char * str2);

2、返回值

函数返回字符串str2在字符串str1中第⼀次出现的位置。没有则返回null
字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志。

3、模拟实现

char* my_strstr(const char* arr1, const char* arr2)
{
	char* cp = (char*)arr1;
	char* s1, * s2;
	if (*arr2=='\0')//arr2空字符串返回arr1,实际上到arr1末尾才被匹配到
	{
		return (cp);
	}
	while (*cp)
	{
		s1 = cp;
		s2 = (char*)arr2;
		while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')// 保证s1和s2先不要到\0;如果s1剩余的不够s2则暴力破解;
		{
			s1++;
			s2++;
			if (*s2 == '\0')
			{
				return (cp);
			}
		}
		cp++;
	}
	return (NULL);
}
int main()
{
	char arr1[] = { "sasfdsff" };
	char arr2[] = { "sf" };
	printf("%s", my_strstr(arr1, arr2));
	return 0;
}

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suiyi_freely

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值