字符函数和字符串函数的使用和实现

c语言本身是没有字符串类型的,字符串常常放在常量字符串或者字符数组中,字符串常量适用于对他不做修改的字符串函数。

求字符串长度:
strlen:

size_t strlen( const char* str);
  • 字符串以‘\0’作为结束标志,strlen函数返回的是‘\0’之前的字符个数,不包含‘\0’.
  • 参数指向的字符串必须是以’\0’结束的。
  • 返回值size_t是一个无符号的整形。(易错点)
  • 求长度不改变字符串应该用const修饰。

实现strlen的三种方式:

//计数器方式
int my_strlen(const char*str)
{
	int count = 0;
	while(*str)
	{
		count++;
		str++;
	}
	return count;
}
//不创建临时变量的方式(递归)
int  my_strlen(const char* str)
{
	if(*str == '\0')
	{
		return 0;
	}
	return 1+my_strlen(str+1);
}
//指针相减的方式
int my_strlen(const char* str)
{	
	char* p = *str;
	while(*p)
	{
		p++;
	}
	return p-str;
}

strcpy:

  • 源字符串必须以’\0’结束。
  • 会将’\0’拷贝到目标空间。
  • 目标空间需要足够大。
  • 目标空间必须可变。
//参数顺序
//函数的功能终止条件
//assert
//const修饰指针
//函数返回值

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

} 

strcat:

char* strcat(char* destination, const char* source);
  • 源字符串不许要以’\0’结束。
  • 目标空间需要足够大。
  • 目标空间必须可修改。
char* my_strcat(char* best, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while(*dest)
	dest++;
	while(*dest++ = *src++ );
	return ret;
}

strstr:
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

char* my_strstr(const char* str1, const char *str2)
{
	assert(str1);
	assert(str2);

	char* cp = (char*)str1; //const 类型的变量不能给普通类型赋值
	char* substr = (char*)str2;
	char *s1 = NULL;
	
	if(*str2 == '\0')
	{
		return NULL;
	}

	while(*cp)
	{
		s1 = cp;
		substr = str2;
		while(*s1 && (*s1 == *substr))
		{
			s1++;
			substr++;
		}
		if(*substr == '\0')
		{
			return cp;
		}
		cp++;
	}
}

strcmp: 比较

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字。
  • 第一个字符串等于第二个字符串,则返回0。
  • 第一个字符串小于第二个字符串,则返回小于0的数字。
int my_strcmp(const char* str1, const char* str2)
{
	int ret = 0;
	assert(str1);
	assert(str2);

	while( !(ret = *(unsigned char*)str1- *(unsigned char*)str2) && *str1)
		++str1,++str2;
	return ret;
}

其他函数

strtok切分字符串
strerror错误报告
tolower\toupper字符转换
memcpy按字节拷贝
memmove原内存块和目标内存块可以重叠的字节拷贝
memcmp按字节比较
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值