一篇文章让你看懂C语言字符函数和内存函数

目录

一、字符函数

1.strlen函数

 1.1strlen函数的介绍

1.2strle函数的使用

1.3模拟实现strlen 

1.3.1指针移动法

1.3.2指针减去指针法 

 1.3.3函数递归法

 2.strcpy函数

​编辑

  2.1strcpy函数的介绍

2.2strcpy函数的使用

 2.3模拟实现strcpy

 3.strcat函数

 3.1strcat函数的介绍

3.2strcat函数的使用

 3.3模拟实现strcat

4.strcmp函数

4.1strcmp函数的介绍 

4.2strcmp函数的使用

4.3模拟实现strcmp函数

5.strstr函数

 5.1strstr函数的介绍

5.2strstr函数使用

 5.3模拟实现strstr函数

 二、内存函数

1.memcpy函数

 1.1memcpy函数的介绍

1.2 memcpy函数的使用

 1.3模拟实现memcpy

 2.memmove函数​编辑

2.1memmove函数的介绍

2.2memmove函数的使用

2.3模拟实现memmove


一、字符函数

1.strlen函数

 1.1strlen函数的介绍

strlen函数的作用:得到一个 字符串的长度

通过查询我们看到strlen函数的定义:参数为const修饰的指针,返回类型为size_t。

注意:

1. strlen函数的返回类型为size_t(无符号整形)

int main()
{
	if (strlen("abc") - strlen("abcdef") > 0)
	{
		printf("大于\n");
	}
	else
	{
		printf("小于等于\n");
	}
	return 0;
}

 一篇文章让你看懂C语言字符函数和内存函数_第1张图片

 为什么是大于呢?

-3 
原码:1000 0000 0000 0000 0000 0000 0000 0011
反码:1111 1111 1111 1111 1111 1111 1111 1100
补码:1111 1111 1111 1111 1111 1111 1111 1101
因为是无符号数最高位就不是符号为是一个大于零数所以打印结果为大于

2.所求字符串必须是以'\0'结尾

int main()
{
	char arr[5] = { 'a','b','c','d','e' };
	printf("%d \n", strlen(arr));
	return 0;
}

 一篇文章让你看懂C语言字符函数和内存函数_第2张图片

1.2strle函数的使用

int main()
{
	char arr[] = "hello world";
	printf("%d\n", strlen(arr));
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第3张图片

1.3模拟实现strlen 

这里提供三种方法给大家参考

1.3.1指针移动法

size_t my_strlen(char* str) 
{
	int num = 0;
	while (*str != 0)
	{
		str++;
		num++;
	}
	return num;
}
int main()
{
	size_t ret = my_strlen("abcdef");
	printf("%d\n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第4张图片

1.3.2指针减去指针法 

size_t my_strlen(char* str)
{
	char* p = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - p;
}
int main()
{
	size_t ret = my_strlen("abcdef");
	printf("%d\n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第5张图片

 1.3.3函数递归法

size_t my_strlen(char* str)
{
	if (*str == 0)
	{
		return 0;
	}
	else
	{
		str++;
		return 1 + my_strlen(str);
	}
}
int main()
{
	size_t ret = my_strlen("abcdef");
	printf("%d \n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第6张图片

 2.strcpy函数

一篇文章让你看懂C语言字符函数和内存函数_第7张图片

  2.1strcpy函数的介绍

strcpy函数的作用:将一个字符串拷贝到另外一个字符串中

通过查询我们可知:strcpy函数的返回类型为char *,第一个参数为 char *destination (目标字符串指针),第二个参数为 char * source(被拷贝字符串的指针)

注意:

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

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

3.目标空间必须走勾搭,以确保能存放源字符串

4.目标空间必须可变。

2.2strcpy函数的使用

int main()
{
	char arr1[] = "xxxxxxxxxxxxxxx";
	printf("arr1拷贝前:%s \n",arr1);
	char arr2[10] = "abcdefgh";

	char* ret = strcpy(arr1, arr2);
	printf("\narr1拷贝后: %s \n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第8张图片

 2.3模拟实现strcpy

char* my_strcpy(char* str2,const char* str1)
{
	assert(*str1 && *str2);
	char* ret = str2;
	while (*str1) 
	{
		*str2 = *str1;
		str1++;
		str2++;
	}
	*str2 = *str1;  
    //源字符串 '\0'的打印

	while (*str2++ = *str1++)
	{
		;
	}
	return ret;
}


int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "xxxxxxxxxx";
    //目标空间必须可变
	printf("arr2数组copy前:%s\n", arr2);
	char *p=my_strcpy(arr2, arr1);
	printf("arr2数组copy后:%s\n",p);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第9张图片

 3.strcat函数

一篇文章让你看懂C语言字符函数和内存函数_第10张图片

 3.1strcat函数的介绍

strcat函数的作用:用于将一个字符串(源字符串)连接到另一个字符串(目标字符串)的末尾,简单点来说就是将两个毫不相干的字符串连接在一起组成一个新的字符串。

通过查询我们可知:strcat函数的参数,返回值类型和strcpy函数的类型和意义都相同

注意:

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

2.目标空间必须足够大,能够容下源字符串的内容。

3.目标空间必须可以修改。

3.2strcat函数的使用

int main()
{
	char arr1[100] = "hello ";
	char arr2[10] = "world";
	char* ret = strcat(arr1, arr2);
	printf("%s \n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第11张图片

 3.3模拟实现strcat

char* my_strcat(char* str1,const char* str2)
{
	char* p = str1;
	while (*str1 != '\0')
	{
		str1++;
	}
	while (*str1++ = *str2++);
	return p;
}
int main()
{
	char arr1[100] = "hello ";
	char arr2[] = "world";
	char* ret = my_strcat(arr1, arr2);
	printf("%s\n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第12张图片

4.strcmp函数

一篇文章让你看懂C语言字符函数和内存函数_第13张图片

4.1strcmp函数的介绍 

strcmp函数的作用:用于比较两个字符串的大小。

通过查询我们可知:strcmp函数的返回值为intl类型,参数为const修饰不可修改的连个 char * 类型的指针;

注意:

标准规定:

第一个字符串大与第二个字符串,则返回大于0的数字。

第一个字符串等于第一个字符串,则返回0。

第一个字符串小于第一个字符串,则返回小于0的数字。

那么如何判断两个字符串呢?

说是比较字符串的大小,其实是比较字符传中每个字符的大小。

从两个字符串中的起始字符开始按照标准规定一个一个比较下去,知道判断出某一个字符的大小,才会返回数字,如果返回0的话意味着两个字符串中的每个字符都相等。

4.2strcmp函数的使用

int main()
{
	char arr1[] = "abc";
	char arr2[] = "adc";
	int ret = strcmp(arr1, arr2);
	printf("%d \n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第14张图片

 在这个例子中arr1字符串中的第二个字符 'b' 小于arr2字符串中的第二个字符 'd',所以返回一个小于0的数字。

4.3模拟实现strcmp函数

int my_strcmp(char* str1, char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[] = "abc";
	char arr2[] = "abc";
	int ret = my_strcmp(arr1,arr2);
	printf("%d\n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第15张图片

5.strstr函数

一篇文章让你看懂C语言字符函数和内存函数_第16张图片

 5.1strstr函数的介绍

strstr函数的作用:用于在一个字符串中查找另一个字符串的第一次出现的位置。(判断一个字符串是否为一个字符串的子字符串)。

通过查询我们可知:strstr函数的返回值为char * 类型的指针,参数为两个不可修改的char *类型的指针

5.2strstr函数使用

int main()

{

	char arr1[] = "abbbcde";
	char arr2[] = "bbc";

	char* ret = strstr(arr1, arr2);
	printf("%s \n", ret);
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第17张图片

 5.3模拟实现strstr函数

char* my_strstr(char *str1, char* str2)
{
	char* cp = str1;
	char* s1 = str1;
	char* s2 = str2;
	if (*str2 == '\0')
		return str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cp;
		cp++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";

	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第18张图片

 二、内存函数

1.memcpy函数

一篇文章让你看懂C语言字符函数和内存函数_第19张图片

 1.1memcpy函数的介绍

通过查询我们可知:用于将一段内存的内容复制到另一段内存区域。

1. 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2. 这个函数在遇到 '\0' 的时候并不会停下来。
3. 如果source和destination有任何的重叠,复制的结果都是未定义的

1.2 memcpy函数的使用

将arr1中的40个字节的数据复制到arr2中

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	int arr2[20] = { 0 };
	memcpy(arr2, arr1, 40);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第20张图片

 1.3模拟实现memcpy

void* my_memcpy(void* dest, void* src, size_t num)
{
	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}

	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 40);

	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第21张图片

 2.memmove函数一篇文章让你看懂C语言字符函数和内存函数_第22张图片

2.1memmove函数的介绍

通过查询我们可知:用于在内存中移动一段数据块的内容。

1. 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2. 如果源空间和目标空间出现重叠,就得使用memmove函数处理。 

2.2memmove函数的使用

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };
	memmove(arr1 + 2, arr1, 20);

	int i = 0;

	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第23张图片

2.3模拟实现memmove

void* my_memmove(void* dest, void* src,size_t num)
{
	void* ret = dest;
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1, arr1+2 ,20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

一篇文章让你看懂C语言字符函数和内存函数_第24张图片

 

你可能感兴趣的:(C,language,learning,c语言,c++)