字符串函数是啥

字符串函数

长度不受限制的字符串函数
#strcpy
#strcat
#strcmp

长度受限制的字符串函数
#strncpy
#strncat
#strncmp

字符串查找

#strstr
#strtok

strlen函数实现

三种实现方法
1.计数器方法

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

2.不创建临时变量递归实现

int my_strlen( const char *str)//不能创建临时变量用了递归
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

3.指针减指针

int my_strlen(char *str)//指针减指针//返回的是两指针之间的元素个数
{
	char *str2 = str;
	while (*str2 != '\0')
	{
		str2++;
	}
	return str2 - str;
}

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

长度不受限制的字符串函数实现

strcpy 函数实现

char * my_strcpy(char *dest, const char *src)
{
	char * ret = dest;
	assert(dest&&src);

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

1)保证目标空间必须足够大放得下相关的内容
2)目标空间可以被修改
//
strcat 函数实现

char * my_strcat(char * dest, const char * src)
{
	assert(dest && src);
	char * ret = dest;
	while (*dest)	//找到目标字符串中的‘\0’
	{
		dest++;
	}
	while (*dest++ = *src++)	//将源头数据追加过去包括‘\0’
	{
		;
	}
	return ret;	//返回值是目标空间的起始地址

字符串追加自己本身

char * my_strncat(char * str1, const char * str2, size_t num)
{
	assert(str1&&str2);
	char * ret = str1;
	while (*str1)
	{
		str1++;
	}
	while (num--)
	{
		if ((*str1++ = *str2++) == 0)
			return ret;
	}
	*str1 = '\0';
	return ret;
}
int main()
{
	char arr1[] = "hello ";
	char arr2[] = "hello";
	char * ret = my_strncat(arr1, arr2, 3);
	printf("%s\n", ret);
	return 0;
}

在这里插入图片描述

strcmp 函数的实现

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)
	{
		if (*s1 == '\0')	//如果是0直接返回退出
		{
			return 0;
		}
		s1++;		//相等向后移动
		s2++;
	}
	return *s1 - *s2;//s1 s2不相等直接返回两个元素的差值
	实质上是ascll码值比较
}

比较大小,每个元素一一对应,相等向后走,与长度无关,只管比较两个元素的ascll码值的大小

长度受限制的字符串函数

strncmp 函数
int strncmp ( const char * str1, const char * str2, size_t num )
相对于strcmp 会相对安全 会考虑目标空间是否放得下
size_tnum限定个数长度

字符串查找函数实现

strstr 函数
在字符串中查找另一个字符串
将str1(包含要匹配的字符序列的字rst符串)的首元素地址与str2(要查找的字符串)对比不相等str1向后移,直到str1元素与str2
元素相等,str2也一起向后移,并且当两个元素不匹配时找不到了,应该回退到上一次匹配开始的下一个位置

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = NULL;	//记录最开始的起始位置
	const char* s2 = NULL;
	const char* sp = str1;	//记录开始匹配的起始位置地址

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

	while (*sp)
	{
		s1 = sp;
		s2 = str2;
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)sp;	
		}
		sp++;	//如果没找到就回退到上一次匹配开始的地址的下一个位置
	}

	return NULL;
}

strtok函数
切割字符串
char * strtok ( char * str, const char * delimiters )
delimiters 参数是个字符串,定义了用作分隔符的字符集合
例如" @ - . * " 自己指定设计

strtok第一次调用时传一个字符串,再次调用可传一个空指针过去。
找到第一个标记,更改,并且记录更改位置的地址,再调用strtok第一个参数为空指针时,从上一次保存好的位置开始,再进行寻找分隔符,并且改为\0,以此类推。

int main()
{
	char arr1[] = "- This ,a sample .string";
	char tmp [20] = { 0 };
	const char * sep = "-,. ";
	char * str = NULL;
	strcpy(tmp, arr1);//由于strtok函数会改变原来字符串的内容,创建临时变量
	for (str = strtok(tmp, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	//for循环初始化一次,刚好契合strtok函数传参第一次传有效地址
	return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值