string.h文件下的memchr、memset、memmove、memcpy、memcmp,以及自定义实现同功能函数

目录

一、memchr

  

二、memset

  

三、memmove

  

四、memcpy

  

五、memcmp

自定义实现:

一、memchr

 二、memset

三、 memmove

四、memcpy

五 、memcmp



一、memchr

   

        该函数用来查找数据中的是否存在某个数(直接对字节进行查找)

   

   


memchr用法:

     

  • 函数声明:

  • 函数的参数:

memchr例子:

int main()
{
	char arr[] = "the memchr";
	char* pa = (char*)memchr(arr, 'm', 10);//强制类型转化为char*
	if (pa == NULL)//检测返回值是否为空指针
		printf("not found");
	else
		printf("第一个 %c 是该字符串中第 %d 个",*pa,pa-arr+1);
	return 0;
}

运行结果:

第一个字符 m 是该字符串中第 5 个

  

该函数只能查找字符吗?

  

  • 因为其参数是void*,所以理论上对任何类型的数据都成立,例如:
int main()
{
	int a = 12345;
	int* pa = (int*)memchr(&a, 0x30, 4);//a的内存空间中,第二个字节的是30,所以用0x30当特例
	if (pa == NULL)
		printf("not found");
	else
		printf("%d",*pa);
	return 0;
}

运行结果:

-872415184//存在返回值,所以memchr可以作用int型的数据
  • 因为数据是以2进制位的形式存储,所以拿数据时值难以计算(可以算出)

由上可知,memchr几乎适用于一切类型,不过一般用来查找字符串中的元素

   

 二、memset

    

       该函数用来在字节层面上修改数据

  

  


memset用法:

  

  • 函数声明:

  •  函数的参数:


  

memset例子:

int main()
{
	char arr[] = "this is a the memset";
	char* pa = (char*)memset(arr, '-', 3);//从arr开始,往后3个字符改为'-'
	if (pa == NULL)
		printf("never gonna happen");
	else
		printf("%s", arr);
	return 0;
}

运行结果:

Before: this is a the memset
After:  ---s is a the memset

内存改动如下:( 将arr地址开始往后3个字符依次改为 ’ - ‘ )

   

  

同样,memset也适用于所有类型数据,因为他和别的mem-型函数一样都是直接对内存进行修改

   

三、memmove

        该函数用来进行字节拷贝,可以自己内部拷贝,重叠部分不影响


memmove用法:

  • 函数声明:

  

  • 函数参数


memmove例子:

int main()
{
	char str[] = "this is a test for memmove";
	char* ptr = (char*)memmove(str, str + 10, 5);
	puts(str);
	return 0;
}

运行结果:

Before:this is a test for memmove
After: test is a test for memmove

内存变化:

 

  

memmove也可以做不同字符串之间的拷贝,但常用于自身内部的操作

  

 四、memcpy

        

        用来拷贝字符串,看似与memmove一样,但memcpy难以实现数组自己内部的重叠部分的拷贝

  

   


memcpy用法:

  • 函数声明

  • 函数参数


 memcpy例子:

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "****";
	char* pa = (char*)memcpy(arr2, arr1, 3);
	puts(arr2);
	return 0;
}

运行结果:

abc*

    

但是,这个函数一般情况下不能实现自身内部的拷贝(当两个指针内容有重叠部分时)

五、memcmp

 

        用来比较选定字节内数据的大小比较


memcmp用法:

     

  • 函数声明

    

  •  函数参数


memcmp例子 :

int main()
{
	int a = 123456789;
	int b = 987654321;
	int ret = memcmp(&a+1, &b, 2);
	if (ret>0)
		printf("a>b");
	else if (ret<0)
		printf("a<b");
	else if (ret==0)
		printf("a==b");
	return 0;
}

运行结果:

a>b

内存如下:

  


自定义实现

一、memchr

void* my_memchr(const void* dest,char value,int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		if (*(char*)dest == value)
		{
			return dest;
		}
		(char*)dest+=1;
	}
	return NULL;
}

 二、memset

void* my_memset(void* dest, char value, int num)
{
	while(num--)
	{
		*(char*)dest = value;
		(char*)dest+=1;
	}
}

三、 memmove

void* my_memmove(void* dest, const void* src, int size)
{
	int i = 0;
	void* p1;
	void* p2;
	if(dest<src)
	{
		p1 = dest;
		p2 = src;
		for (i = 0; i < size; i++)
		{
			*(char*)p1 = *(char*)p2;
			(char*)p1 += 1;
			(char*)p2 += 1;
		}
	}
	else
	{
		p1 = (char*)dest + size-1;
		p2 = (char*)src + size-1;
		for (i = 0; i < size; i++)
		{
			*(char*)p1 = *(char*)p2;
			(char*)p1 -= 1;
			(char*)p2 -= 1;
		}
	}
	return dest;
}

 四、memcpy

void* my_memcpy(void*dest,void*src,int size)
{
	void* pa = dest;
	while (--size)
	{
		*(char*)dest = *(char*)src;
		(char*)dest += 1;
		(char*)src += 1;
	}
}

五 、memcmp

int my_memcmp(void* p1, void* p2, int size)
{
	while (--size)
	{
		if (*(char*)p1 - *(char*)p2 > 0)
			return 1;
		else if (*(char*)p1 - *(char*)p2 < 0)
			return -1;
		(char*)p1 += 1;
		(char*)p2 += 1;
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值