字符串函数详细介绍(strlen、strcmp、strcpy、strcat、strstr)

1、函数介绍

1.1   strlen  计算字符串长度

1、字符串已经 '\0' 作为结束标志, strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )
2、参数指向的字符串必须要以 '\0' 结束。
3、注意函数的返回值为 size_t ,是无符号的( 易错 )。
对于第3点易错点有以下代码分析
#include <stdio.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "abc";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2 > str1\n");
	}
	else
	{
		printf("str2 < str1\n");
	}
	return 0;
}

以上代码运行结果如下图所示

对此,我们感到很奇怪,为什么输出结果 str2 > str1 呢?

是由于strlen函数的返回值是size_t类型的,即无符号整型,所以两个无符号整型的数据相减,同样是无符号整形,该类型的数据恒大于0,所以会输出以上结果。

 模拟实现strlen函数

//1.计数器法
int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
//2.递归实现strlen
int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
//利用指针-指针实现strlen
int my_strlen(const char* str)
{
	assert(str);
	char* p = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - p;
}

1.2  strcpy       拷贝字符串

 

1、源字符串必须以 '\0' 结束。
2、会将源字符串中的 '\0' 拷贝到目标空间。
3、目标空间必须足够大,以确保能存放源字符串。
4、目标空间必须可变。
 模拟实现strcpy函数
char* my_strcpy(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return dest;
}

1.3 strcmp        比较字符串

 

//模拟实现strcmp
int my_strcmp(const char* str1,const char* str2)
{
	assert(str1 && str2);
	while (*str1!='\0' && * str1 == *str2)
	{
		str1++;
		str2++;
	}
	if (str1 == '\0')
		return 0;
	return *str1 - *str2;
}

 1.4 strcat       追加字符串

1、源字符串必须以 '\0' 结束。
2、目标空间必须有足够的大,能容纳下源字符串的内容。
3、目标空间必须可修改。

 4、注意,不能字符串自己给自己追加。

//模拟strcat
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

      以上个数不受限的字符串函数,还有几个个数受限的字符串函数,例如strncpy,strncmp,strncat。

1.5 strstr    查找字符串

该函数返回值是找到的字符串的起始地址。

//举例说明strstr的用法
int main()
{
	char str1[] = "abbbcdef";
	char str2[] = "bbc";

	char* find_str = strstr(str1, str2);

	printf("%s\n", find_str);
	return 0;
}

 

 

//模拟实现strstr
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = s1;
	while (*p)
	{
		s2 = str2;
		s1 = p;
		while (*s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)p;
		}
		p++;
	}
	return NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值