重点字符串函数与内存函数介绍

目录

一 字符串函数

1.strcpy函数

2.strcat函数

3.strcmp函数

4.strstr函数

5.strtok函数 

 二 内存函数

1.memcpy 

2.memmove

3.memcmp

4.memset


在c语言中有许多方便操作字符串和内存的函数,接下来我们介绍几个比较重点的函数。

一 字符串函数

1.strcpy函数

其形式是

char * strcpy ( char * destination, const char * source )

指把源字符串的内容全部拷贝到目标字符串中去。destination是目标字符串首元素的地址;source是源字符串首元素的地址。其在使用过程中有一些要点如下:

1.源字符串必须以'\0'结束

2.会将源字符串中的’\0‘拷贝到目标空间

3.目标空间必须足够大,以确保可存下源字符串

4.常量字符串无法修改,因此不能将常量字符串作为目标字符串

5.返回值是char*,是目标数组的首元素地址。

strcpy的模拟实现如下:

char* my_strcpy(char* str1, char* str2)
{
	char* destion = str1;
	while (*str1++ = *str2++)
	{
		;
	}
	return destion;
}

2.strcat函数

其使用形式是

char * strcat ( char * destination, const char * source )

指在目标字符串后追加源字符串。使用过程中的一些要点如下:

1.源字符串是从目标字符串的'\0'开始追加,也就是说目标字符串的'\0'会被覆盖掉。

2.源字符串的'\0'也会被拷贝过去

3.目标空间必须足够大

4.目标空间必须可修改

下面是模拟实现:

char* my_strcat(char* str1, char* str2)
{
	char* ret = str1;
	while (*str1 != '\0')
	{
		str1++;
	}
	while (*str1++ = *str2++)
	{
		;
	}
	return ret;
}

3.strcmp函数

其形式是

int strcmp ( const char * str1, const char * str2 )

进行两个字符串的比较,比较的是对应位置上字符ASCIl码大小,如果第一个字符串小于第二个返回-1;第一个字符串大于第二个返回1;两个相等返回0.

模拟实现如下:

int my_strcmp(char* str1, char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 - *str2 > 0)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}

4.strstr函数

其形式如下

const char * strstr ( const char * str1, const char * str2 )

作用是在一个字符串中找另外一个字符串是否存在

存在:返回子串第一次出现的位置(地址)

不存在:返回空指针

模拟实现思路如下:

具体代码如下:

char* my_strstr(char* str1, char* str2)
{
	const char* p = str1;
	const char* s2 = str2;
	const char*s1 = p;
	if (*str2 == '\0')
	{
		return str1;
	}
	while (1)
	{
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		else if(*s1=='\0')
		{
			return NULL;
		}
			p++;
			s1 = p;
			s2 = str2;
	}
}

5.strtok函数 

具体形式如下

char * strtok ( char * str, const char * delimiters )

strtok函数是字符串切割函数,每使用一次它会将字符串中的第一个特殊字符变为'\0',除第一次使用第一个参数要传被切割字符串首元素的地址之外,其余的使用第一个参数都传NULL。

str是指所要切割字符串的首元素的地址,delimiters指被切割字符串中所有特殊字符的地址

具体使用实例如下:

 打印结果如下:

 二 内存函数

1.memcpy 

具体形式如下

void * memcpy ( void * destination, const void * source, size_t num )

作用是将源内存中num个字节的内容,拷贝到目标内存中。可以拷贝不同类型的数据,但是源空间和目标空间所能存放的数据类型必须相同。

模拟实现如下:

void* my_memcpy(void* str1, void* str2, int num)
{
	void* ret = str1;
	while (num--)
	{
		*(char*)str1 = *(char*)str2;
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
	}
	return ret;
}

2.memmove

具体形式如下

void * memmove ( void * destination, const void * source, size_t num )

作用是实现重叠内存的拷贝,也就是自己拷贝自己num个字节的内容。

模拟实现的要点:

1.dest<src

从前往后拷贝

2.dest>src

从后往前拷贝

3.因其接受参数类型是void*,因此要将其强制类型转换成char*来进行计算。

具体代码如下:

void* my_memmove(void* dest, void* str, int num)
{
	assert(dest);
	assert(str);
	char* ret = dest;
	if (dest < str)
	{
		while (num--)
				{
					*(char*) dest= *(char*)str;
					dest = (char*)dest + 1;
					str = (char*)str + 1;
				}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)str + num);
		}
	}
	return ret;
}

3.memcmp

其具体形式如下

int memcmp ( const void * ptr1, const void * ptr2, size_t num )

作用是对ptr1与ptr2所指向的两块内存进行一个字节一个字节的比较,大于0返回1;小于0返回-1;相等返回0.

4.memset

其具体形式如下

void * memset ( void * ptr, int value, size_t num )

作用是将ptr所指向内存块的num个字节的数据全部改为value。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值