带你快速了解C语言【字符串与内存函数】

目录

一.字符串函数

1.strlen

①.函数功能

②.实例

③. 函数模拟

2. strcpy

①.函数功能

②.实例

③.函数模拟

3.strcat

①.函数功能

②.实例

③.函数模拟

4.strcmp

①.函数功能​编辑

②.实例

③.函数模拟

5.strncpy

①.函数功能

②.实例

③.函数模拟

6.strncat

①.函数功能

②.实例

 ③.函数模拟

7.strncmp

①.函数功能

②.实例

 ③.函数模拟

8.strstr

①.函数功能

②.实例

③.函数模拟

9.strerror

①.函数功能

②.实例

二.内存函数

1.memcpy

①.函数功能

 ②.实例

③.函数模拟

 2.memmove

①.函数功能

②.实例

③.函数模拟

④.memove与memcpy的区别


一.字符串函数

 

1.strlen

①.函数功能

用于计算字符串长度。-------以'\0'为结束标志。

参数:字符串

返回类型 size_t (无符号形)

②.实例

③. 函数模拟

size_t my_strlen(char* arr)
{
    int len = 0;
    char* p = arr;
    while (*p!='\0')
    {
        len++;
        p++;
    }
    return len;
}

2. strcpy

①.函数功能

用于字符串拷贝。

参数:字符串和字符串

返回类型:char*

注意事项: 

 1.把字符串2拷贝到字符串1会覆盖字符串1。

 2.字符串1的空间必须足够大,能存放拷贝过来的字符串。

 3.字符串内的空间必须可变,不能是常量字符串。

 eg:
 char*p="abcdefg"

 char arr[]="ooxx";

 p指向的空间不可变

②.实例

③.函数模拟

char* my_strcpy(char* arr, const char* arr2)
{
    while (*arr2 != '\0')
    {
        *arr = *arr2;
        arr++;
        arr2++;
    }
    return arr;
}

3.strcat

①.函数功能

用于字符串连接。

参数:字符串和字符串

返回类型:char* 

字符串1的空间必须足够大,能存放连接过来的字符串。

字符串1内的空间必须可变,不能是常量字符串。

②.实例

③.函数模拟

char* my_strcat(char* arr, const char* arr2)
{
	char* p = arr;
	while (*arr != '\0')
	{
		arr++;
	}
	while (*arr2 != '\0')
	{
		*arr = *arr2;
		arr2++;
		arr++;
	}
	return p;
}

4.strcmp

①.函数功能

用于字符串比较大小

  

参数:两个字符串

返回类型:int(字符串A>字符串B,返回1,反之返回-1,相等返回0)

②.实例

③.函数模拟

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

5.strncpy

①.函数功能

用于拷贝n个字符从源字符串到目标空间。

 

参数:目标空间和源字符串,一个size_t类型指定字符数

返回类型:char*

 目标空间得足够大 以备存放拷贝到的字符串 

②.实例

③.函数模拟

char* my_strncpy(char* str1, const char* str2, size_t sz)
{
	while (sz--)
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	return str1;
}

6.strncat

①.函数功能

用于连接n个字符从源字符串到目标空间。 

 

参数:目标空间,源字符串,一个size_t类型指定字符数

返回类型:char*

目标空间得足够大 以备存放连接到的字符串 

②.实例

 ③.函数模拟

char* my_strncat(char* str1,const char* str2,size_t sz)
{
	char* start = str1;
	while (*str1 != '\0')
	{
		str1++;
	}
	while (sz--)
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	return start;
}

7.strncmp

①.函数功能

用于比较到出现另个字符不一样
                        或者一个字符串结束
                        或者 num个字符全部比较完。
 
参数:源字符串,目标空间,一个size_t类型指定字符数
返回类型:int型      --  str1>str2 返回 1
                               --  str1<str2 返回 -1
                               --  str1=str2 返回 0

②.实例

 ③.函数模拟

int my_strncmp(const char* str1, const char* str2, size_t sz)
{
	while (*str1 != '\0' && (*str2 != '\0') && sz--)
	{
		if (*str1 > *str2)
		{
			return 1;
		}
		else if (*str1 < *str2)
		{
			return -1;
		}
		else
		{
			str1++;
			str2++;
		}
	}
		return 0;
}

8.strstr

①.函数功能

用于判断子串。

 

参数:一个母串,一个字符串。

返回类型:char* (返回子串在母串的起始地址

②.实例

③.函数模拟

char* my_strstr(const char* str1,const char* str2)
{
	char* s1 = NULL;     
	char* s2 = NULL;
	char* cur = str1;
	while (*cur != '\0')
	{
		s1 = cur;       //没找到复位
		s2 = str2;     //没找到复位
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) //相等且不为空
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')  //找到了
		{
			return cur;
		}
		cur++;          //没找到且不相等,就往后走

	}
	return NULL;     //没找到
}

9.strerror

①.函数功能

用于返回错误码,所对应的错误信息。

 

参数:int类型的错误码

返回类型:char* ----错误信息

需包含头文件#include<errno.h> 

②.实例

二.内存函数

1.memcpy

①.函数功能

用于source的位置开始向后复制num个字节的数据到destination的内存位置。

 

参数:目标空间,源空间,几个字节

返回类型:void* (数据决定返回类型)

 ②.实例

③.函数模拟

void* my_memcpy(void* arr, const void* brr, int sz)
{
	void* ret = arr;
	while (sz--)
	{
		(*(char*)arr) = (*(char*)brr);
		arr = (char*)arr + 1;         //void*类型无法运算
		brr = (char*)brr + 1;
	}

	return ret;
}

 2.memmove

①.函数功能

用于source的位置开始向后复制num个字节的数据到destination的内存位置。

 

参数:目标空间,源空间,几个字节

返回类型:void*(按数据决定)  

②.实例

③.函数模拟

void* my_memmove(void* arr, const void* brr, size_t num)
{
	void* ret = arr;
	if (arr < brr)
	{
		//前-->后
		while (num--)
		{
			*(char*)arr = *(char*)brr;
			arr = (char*)arr + 1;
			brr = (char*)brr + 1;
		}
	}
	else
	{
		//后->前
		while (num--)
		{
			*((char*)arr + num) = *((char*)brr + num);
		}
	}

	return ret;
}

④.memove与memcpy的区别

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JJY_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值