Lesson 19 字符串函数介绍与模拟实现2

本文介绍了C语言中的几个核心字符串处理函数:strcmp用于比较字符串,strncpy和strncat用于字符复制和拼接,strstr用于查找子串,strerror返回错误信息,以及内存拷贝函数memcpy。通过模拟实现展示了这些函数的工作原理和用法。

剩余字符串函数的功能介绍与模拟实现。

strcmp

比较两个字符串的大小:

  1. 如果第一个字符串大于第二个字符串,返回一个大于0的数字;
  2. 如果相等,返回0;
  3. 如果第一个字符串小于第二个字符串,返回一个小于0的数字;

这个比较简单,模拟实现如下:

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

strncpy

类似strcpy,拷贝num个字符。

int  main()
{
	char arr1[10] = "xxxxxxx";
	char arr2[] = "abcdef";
	strncpy(arr1, arr2,3);
	printf("%s\n", arr1);

	return 0;
}

作用是将arr2中的3个字符拷贝到arr1里面。模拟实现如下:

char* my_strncpy(char* dst, const char* src,size_t num)
{
	assert(dst && src);
	char* ret = dst;
	while (num && (*dst++ = *src++))
		num--;
	if (num)
		while (--num)
			*dst++ = '\0';
	return ret;
}

这里精髓在while (num && (*dst++ = *src++)) 这一句上。自己写的代码比较丑,这里参考了源码的写法,注意理解。(*dst++ = *src++)实现了拷贝,然后通过num–来控制拷贝的数量。如果说拷贝完成之后,num还没有归零,那么其余部分都补成\0。

strncat

类似strcat,多一个参数n,在目标字符串上拼接n个源字符串中的字符。
参考上面的实现,模拟实现如下:

char* my_strncat(char* dst, const char* src, size_t num)
{
	assert(dst && src);
	char* ret = dst;
	while(*dst)//找到dst里的\0
	{
		dst++;
	}
	while (num && (*dst++ = *src++))//参考ncpy
	{
		num--;
	}
	return ret;
}

strstr

查找目标字符串中是否包含子字符串。如果存在,返回子字符串在目标字符串中的起始位置,如果不存在,返回NULL。
实现如下:

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	const char* cp = str1;
	const char* s1 = NULL;
	const char* s2 = NULL;

	while (*cp)//cp: 记录可能找到匹配的字符串的起始位置
	{
		s1 = cp;
		s2 = str2;
		//如果子串是空,返回str1
		if (*str2 == '\0')
			return str1;
		while (*s1 == *s2 && *s1 && *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cp;
		cp++;
	}
	return NULL;
}

分析一下:

  1. cp作为记录匹配字符串的起始位置
  2. s1 和s2 分别指向原字符串和子字符串,做运算时只通过这两个指针操作;

strerror

返回一个错误码所对应错误信息的起始地址。举个例子:

int main()
{
	FILE* pf = fopen("add.txt", "r");
	if (pf == NULL)
	{
		printf("打开失败,失败原因:%s\n", strerror(errno));
		return 1;
	}
	else
	{
		printf("打开文件成功\n");
	}
	return 0;
}

错误码会记录到errno这个全局变量里,strerror就是通过错误码打印错误信息。

内存函数memcpy

针对内存块的拷贝,无论数据是什么。
模拟实现如下:

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

以字节单位拷贝源内存区数据到目标内存区。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值