飞道的博客

C语言 模拟实现strcpy()、strcat()、strstr()、strchr()、strcmp()、memcpy()、memmove()

365人阅读  评论(0)

1. 模拟实现strcpy()

  1. 函数说明
      strcpy()会将src字符串拷贝带dest所指的地址。

  2. 返回值
      返回参数dst的字符串起始地址。

  3. 附加说明
      如果参数dst所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况, 在编写程序时请特别留意, 或者用strncpy()来取代。

//字符串拷贝
char* strcpy(char *dst, const char *src)
{
	assert(dst != NULL && src != NULL);
	char *ret = dst;
	while (*dst++ = *src++);
	return ret;
}

2. 模拟实现strcat()

  1. 函数说明
     strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dst要有足够的空间来容纳要拷贝的字符串。

  2. 返回值
     返回参数dst的字符串起始地址

//字符串拼接
char* strcat(char *dst, const char *src)
{
	assert(dst != NULL && src != NULL);
	char *ret = dst;
	while (*dst)
		dst++;
	while (*dst++ = *src++);
	return ret;
}

3. 模拟实现strstr()

  1. 函数说明
     strstr()会从字符串haystack 中搜寻字符串needle,并将第一次出现的地址返回。

  2. 返回值
     返回指定字符串第一次出现的地址,否则返回0。

//源字符串中是否包含要查找的字符串
char *my_strstr(const char *haystack, const char *needle)
{
	assert(haystack, != NULL && needle != NULL);
	char *str1 = haystack;
	char *str2 = needle;
	if (*needle == 0)
		return NULL;
	while (*str1)
	{
		while (*str1 && *str2 && (*str1 == *str2))
		{
			str1++;
			str2++;
		}
		if (*str2 == 0)
			return haystack;
		else
		{
			str2 = needle;
			str1 = ++haystack;
		}
	}
	return NULL;
}

4. 模拟实现strchr()

  1. 函数说明
     strchr()用来找出参数src字符串中第一个出现的参数character地址,然后将该字符出现的地址返回。
  2. 返回值
     如果找到指定的字符则返回该字符所在地址,否则返回0。
//在字符串中查找指定字符
char *strchr(const char *src, int character)
{
	assert(src != NULL);
	char *str_src = src;
	while (*str_src != character && *str_src != '\0')
		str_src++;
	if (*str_src == character)
		return str_src;
	else
		return NULL;	
}

5. 模拟实现strcmp()

  1. 函数说明
     strcmp()用来比较参数s1和s2字符串。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1第一个字符值减去s2第一个字符值,若差值为0则再继续比较下个字符, 若差值不为0则将差值返回。 例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和’b’(98)的差值(-33)。

  2. 返回值
     若参数s1和s2字符串相同则返回0。 s1若大于s2则返回大于0的值。s1若小于s2则返回小于0的值。

int my_strcmp(const char *dst, const char *src)
{
	assert(dst != NULL && src != NULL);
	int ret = 0;
	while (!(ret = *(unsigned char *)dst - *(unsigned char *)src) && *dst)
	{
		dst++;
		src++;
	}
	if (ret > 0)
		return 1;
	else if (ret < 0)
		return -1;
	else
		return 0;
}

6. 模拟实现memcpy()

  1. 函数说明
     memcpy()用来拷贝src所指的内存内容前n个字节到dst所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束’\0’而结束。
  2. 返回值
     返回指向dest的指针。
void *my_memcpy(void *dst, const void *src, size_t count)
{
	assert(dst != NULL && src != NULL);
	char *dst1 = (char *)dst;
	char *src1 = (char *)src;
	for (int i = 0; i < count; i++)
		dst1[i] = src1[i];
	return dst;
}

7. 模拟实现memmove()

  1. 函数说明
     memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是 当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。

  2. 返回值
     返回指向dest的指针。

  3. 函数说明
     指针src和dest所指的内存区域可以重叠。(以下给出避免重叠的方法)

//内存拷贝(避免内存重叠)
void *my_memmove(void *dst, void *src, size_t count)
{
	assert(dst != NULL && src != NULL);
	char *str_dst = (char *)dst;
	char *str_src = (char *)src;
	if (dst < src)
	{
		//前重叠或前不重叠,从前向后拷
		for (int i = 0; i < count; i++)
			str_dst[i] = str_src[i];
	}
	else
	{
		//后重叠或后不重叠,从后往前拷
		for (int i = count - 1; i >= 0; i--)
			str_dst[i] = str_src[i];
	}
	return dst;
}

转载:https://blog.csdn.net/yangke369/article/details/105922364
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场