[c语言]对各种字符串库函数的实现strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

1.模拟实现strcpy

//1.模拟实现strcpy(字符串拷贝)
#include<stdio.h>
#include<assert.h>
char * my_strcpy(char *dest,const char *str)
{
 	char *p = dest;
	assert(dest);
 	assert(str);
 	while(*dest++ = *str++)
 	{
  		;
 	}
 return p;
}
int main()
{
 	char *arr = "hello world";
 	char a[1024] = {0};
	my_strcpy(a,arr);
 	puts(a);
 	return 0;
}

2.模拟实现strcat

//2.模拟实现strcat(字符串拼接)
#include<stdio.h>
#include<assert.h>
char * my_strcat(char *dest,const char *src)
{
 	char *p = dest;
 	assert(src);
 	while(*dest)//不能用while(*dest++),因为strcat的功能是把src所指字符串添加到dest结尾处(覆盖dest结尾
               //处的'\0')并添加'\0',while(*dest++)在循环结束后还会执行一次++,会指向'\0'的下一个位置
 	{
  		dest++;
 	}
 while(*dest++ = *src++)
 {
  	;
 }
 return p;
}
int main()
{
 	char *str = "man";
 	char arr[1024] = "hello ";
 	my_strcat(arr,str);
 	puts(arr);
 	return 0;
}

3.模拟实现strstr

//3.模拟实现strstr(字符串查询,一个字符串是否是另一个字符串的子串)
#include<stdio.h>
#include<assert.h>
char * my_strstr(char *dest, const char *src)
{
	 const char *s1 = dest;//父串
	 const char *s2 = src;//子串
	 const char *cur = dest;//记录父串地址
	 assert(dest);
	 assert(src);
	 if(*src == '\0')
  		return dest;
 	while(*cur)
 	{
		  s1 = cur;
		  s2 = src;
 	 while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0')//注意一定要判断是否到'\0',否则会死循环
	  {
		   s1++;
		   s2++;
	  }
	  if(*s2 == '\0')
	  {
	   	return (char *)cur;
	  }
	  if(*s1 == '\0')
 	 {
   		return NULL;
 	 }
  	cur++;
 	}
 	return NULL;
}
int main()
{
	 char *arr1 = "i am a student";
	 char *arr2 = "student";
	 char *ret = my_strstr(arr1,arr2);
	 puts(ret);
	 return 0;
}

4.模拟实现strchr

//4.模拟实现strchr(查找一个字符在字符串首次出现的位置)
#include<stdio.h>
#include<assert.h>
char * my_strchr(const char *dest,int n)
{
 	assert(dest);
 	while(*dest)
 	{
  		if(*dest == n)
  		{
   			return (char*)dest;
  		}
  		dest++;
 	}
 	return NULL;
}
int main()
{
 	char *str = "asdfghjk,l";
 	char *ptr = my_strchr(str,'h');
 	printf("%c这个字符在%s的首字符\n",'h',ptr);
 	return 0;
}

5.模拟实现strcmp

//5.模拟实现strcmp(比较字符串)
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char *str1,const char *str2)
{
	 assert(str1);
	 assert(str2);
 	while(*str1 && *str2)
 	{
  		if(*str1 > *str2)
   		return 1;
		else if(*str1 < *str2)
		return -1;
		else 
	  	{
   			str1++;
   			str2++;
  		}
 	}
 	return 0;
}
int main()
{
 	char *arr1 = "good";
 	char *arr2 = "bad";
 	int ret = my_strcmp(arr1,arr2);
 	if(ret > 0)
 	{
  		printf("字符串1大于字符串2\n");
 	}
 	else if(ret < 0)
 	{
  		printf("字符串1小于字符串2\n");
 	}
 	else
 	{
  		printf("两字符串相等\n");
 	}
 	return 0;
}

6.模拟实现memcpy

//6.模拟实现memcpy(从源指向的位置(起始位置)将count字节的值直接复制到目标指向的内存块)
#include<stdio.h>
#include<assert.h>
void *my_memcpy(void *dest,const void *src,size_t count)
{
	 char *p = dest;//给目标和源转换类型,否则void*不知道大小
	 char *p1 = dest;
	 const char *p2 = src;
	 assert(dest);
	 assert(src);
	 while(count--)
	 {
	  	*p1++ = *p2++;
 	}
 	return p;
}
int main()
{
 	char arr1[1024] = {0};
 	char *arr2 = "hello world";
 	my_memcpy(arr1,arr2,7);
 	puts(arr1);
 	return 0;
}

7.模拟实现memmove

//7.模拟实现memmove(从源指向的位置拷贝count个字节的值放在目标所指向的位置)
//memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,
//memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
//但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
#include<stdio.h>
#include<assert.h>
void * my_memmove(void *dest,const void *src, size_t count)
{
	 char *ret = dest;
	 char *p1 = dest;
	 const char *p2 = src;
	 assert(src);
	 assert(dest);
	 if(dest < src)
	 {
	  	while(count--)
	  	{
	   		*p1++ = *p2++;
	  	}
	 }
	 else
	 {
	  	while(count--)
  		{
   			*(p1+count) = *(p2+count);
  		}
 	}
 	return ret;
}
int main()
{
	 char str1[1024] = "abcde";
	 char *str2 = "fghijk";
	 my_memmove(str1+4,str2,5);
	 puts(str1);
	 return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值