字符串操作函数及内存操作函数

本次分享了各种字符串函数的使用和部分模拟实现 ,希望能对你有所帮助。

strlen:求字符串的长度

模拟实现:

int my_strlen(const char* str)
{
	assert(str);//记得加上断言,防止对NULL的访问,养成好习惯
	int count = 0;
	while (*str++)
	{
		count++;
	}
	return count;
}

 strcmp:字符串的大小比较

函数原型:int strcmp( const char *string1, const char *string2 );

规则:从两个字符串的第一个字符开始比较,相等则继续,若同时为‘\0’则返回0值,若不同,当string1位置比string2位置的大时,返回一个大于0的数,小于则返回负数

模拟实现:

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);

	while (*str1 == *str2)//相同则继续
	{
		if (*str1 == '\0')//如同时为'\0',返回0
			return 0;
		str1++;
		str2++;
	}

	return *str1 - *str2;//两字符的ascii码之差
}

strncmp:比较字符串,可以指定比较字符个数

int my_strncmp(const char* str1, const char* str2, int count)
{
	//比较count个字符串的长度
	//若count大于str2中字符的个数,则比较完整的字符串

	while (count--)
	{
		if (*str1 == *str2)
		{
			if (*str1 == '\0')
				return 0;
			if (count == 0)
				break;
			str1++;
			str2++;
		}
		else
		{
			break;
		}
	}
	return *str1 - *str2;

}

 strcat:字符串追加函数

 函数原型:char *strcat( char *dst, const char *src );

将字符串src的内容从dst的‘\0’开始(会覆盖)拷贝到dst中

模拟实现:

char* my_strcat(char* dst, const char* src)
{
	assert(dst && src);
	char* ret = dst;
	while (*dst)
	{
		dst++;//找‘\0’
	}

	while (*dst++ = *src++)//注意是赋值,当src指向'\0'时终止
	{
		;
	}
	return ret;
}

strncat:追加指定个数的字符

 char *strncat( char *dst, const char *src, int count );

使用:

int main()
{
	char arr1[20] = "hello ";
	char* arr2 = "abcdef";
	printf("%s", strncat(arr1, arr2,2));
	return 0;
}

运行如下:

strstr:在字符串寻找相同的字串

char *strstr( const char *str, const char *set ); 

返回找到的第一个子串的首地址,若未找到,返回NULL

使用:

 

模拟实现:

char* my_strstr(const char* str, const char* set)
{
	const char* cur = str;
	const char* s1 = str;
	const char* s2 = set;
	while (*cur)//cur记录当前字符串的首地址
	{
		s1 = cur;
		while (*s1 && *s2 && (*s1 == *s2))//当某个字符串走到‘\0’或者两者不同,比较结束
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return (char*)cur;
		cur++;//从下个位置开始找
		s2 = set;//s2重置
	}
	return NULL;
}

strtok

//strtok库函数的使用(string.h)
//char *strtok( char *strToken, const char *strDelimit );
//strDelimit是用作分割符的字符集合
//strToken指向一个字符串,它包含了0个或多个strDelimit中的间隔字符
//strtok函数指向下一个标记(间隔字符的位置)返回这个标记前的字符串的首地址(间隔符会被置为'\0')
//当参数strToken不为NULL时,strtok中将记住第一个分隔符的位置
//当参数为NULL时,strtok会从被保留的位置开始找到下一个标记
//注意:strtok会将strToken改变,所以使用该函数时,我们常常对原串进行拷贝使用,以防修改原串
// 若找不到标记,返回NULL
//int main()
//{
//	char arr1[] = "adsadafgc&dasd@dsd";
//	char arr2[100] = { 0 };
//	strcpy(arr2, arr1);
//	char* sep = "&@";
//	char* x = 0;
//	//找到第一个标记后打印,之后分别打印
//	for (x = strtok(arr2, sep); x != NULL; x = strtok(NULL, sep))
//	{
//		printf("%s\n", x);
//	}
//	return 0;
//}

strerror:错误信息的打印

//strerror的使用
//作用:将对应错误码的错误信息打印出来
//errno:当前错误码
//int main()
//{
//	int* arr = (int*)malloc(INT_MAX);//申请开辟空间过大返回NULL
//	if (arr == NULL)
//	{
//		printf("%s\n", strerror(errno));
//	}
//	return 0;
//}

memcpy:将指定位置指定字节大小的内容拷贝到另一处

//memcpy
//void *memcpy( void *dest, const void *src, size_t count );
//将src位置后count个字节的内容拷贝到dest中

//void* my_memcpy(void* dest, const void* src, int count)
//{
//	assert(dest && src);
//	void* ret = dest;
//	while (count--)
//	{
//		*(char*)dest = *(char*)src;
//		(char*)dest = (char*)dest + 1;
//		(char*)src = (char*)src + 1;
//	}
//
//	return ret;
//}

strncpy:字符串拷贝 :指定大小

//strncpy拷贝count个字符给目的串
//当count大于src长度时,不足的用'\0'补齐
char* my_strncpy(char* dst, const char* src, int count)
{
	assert(dst && src);
	char* ret = dst;
	while (count--)
	{
		*dst = *src;
		if (*src == '\0')
		{
			*dst = *src;
			dst++;
		}
		else
		{
			dst++;
			src++;
		}

	}
	return ret;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值