字符串函数+内存函数

1、前言

在我们c语言学习过程中,学会使用一些库函数是我们必不可少,类似strlen、strcpy等,目的就是为了让我们实现更好的功能。并且通过模拟实现函数更好的理解函数的功能和对c语言以前知识的一个回顾

2、字符串函数

(1)strlen函数

1、函数功能介绍:
在这里插入图片描述
这个函数的功能就是获取字符串的长度,并返回,计算的规则就是遇到"\0"后,停止计算。
2、函数模拟实现(三种方法)
(1)使用计数器

size_t my_strlen(const char* arr)
{
  assert(arr);
	size_t count = 0;
	while (*arr)
	{
		*arr++;
		count++;
	}
	return count;
}

(2)使用递归

size_t my_strlen(const char* arr)
{
	assert(arr);
	if (*arr == '\0')
		return 0;
	return 1 + my_strlen(arr+1);
}

(3)使用指针-指针

size_t my_strlen(const char* arr)
{
	assert(arr);
	char* p = arr;
	while (*p)
	{
		p++;
	}
	return p - arr;
}

这里需要说明的是指针-指针其实就是将两个指针的地址(指针变量)进行做差,最后的结果就是这两个指针之间的元素个数。

(2)strcpy函数

1、函数的功能:
在这里插入图片描述
2、函数的模拟实现

char* my_strcpy(char* dest, char* scr)
{
	assert(dest && scr);
	char* ret = dest;
	while (*dest++ = *scr++)
	{
		;
	}
	return ret;
}
int main()
{
	char str1[] = "abcdef";
	char str2[20] = { 0 };
	my_strcpy(str2,str1);
	printf("%s", str2);
	return 0;
}

在这里插入图片描述

(3)strcat函数

1、函数功能:
在这里插入图片描述
2、函数的模拟实现

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest)
	{
		*dest++;
	}
	while (*dest++=*src++)
	{
		;
	}
	return ret;
}
int main()
{
	char str1[20] = "abcde";
	char str2[] = "abc";
	my_strcat(str1,str2);
	printf("%s", str1);
	return 0;
}

在这里插入图片描述

(4)strcmp函数

1、函数的功能
在这里插入图片描述
在这里插入图片描述

2、函数的模拟实现

int my_strcmp(char* str1, char* str2)
{
	assert(str1 && str2);
	while (*str1==*str2)
	{
		if (*str1='\0')
			return 0;
		str1++;
	    str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char str1[] = "abcde";
	char str2[] = "abcf";
	if (my_strcmp(str1, str2) > 0)
		printf("i love you");
	else
		printf("i hate you");
	return 0;
}

在这里插入图片描述

(5)strncpy等等函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
strcpy、strcat、strcmp这三个函数是没有限制的,有多少,往目的地送多少。
而strncpy、strncmp、strnca是有限制的,通过多传一个n,来限制。

(5)strstr函数

1、函数功能
在这里插入图片描述
2、模拟实现

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

在这里插入图片描述

(6)strtok函数

在这里插入图片描述

(7)strerror函数

在这里插入图片描述

int main()
{
	FILE* pf = fopen("add.txt", "r");
	if (pf == NULL)
	{
		printf("打开文件失败,原因是:%s\n", strerror(errno));
		return 1;
	}
	else
	{
		printf("打开文件成功\n");
		//...
	}
	return 0;
}

在这里插入图片描述

3、字符函数

(1)字符分类函数

在这里插入图片描述
在这里插入图片描述

例子:

#include <stdio.h>
#include <ctype.h>
int main()
{
	char ch = 'w';
	if (islower(ch))
	{
		printf("小写\n");
	}
	else
	{
		printf("非小写\n");
	}

	return 0;
}

在这里插入图片描述

(2)字符转换函数

int tolower ( int c );
int toupper ( int c );

在这里插入图片描述
在这里插入图片描述

4、内存函数

(1)memcpy函数

1、函数功能
在这里插入图片描述
2、函数的模拟实现

#include <string.h>
#include<assert.h>
void* my_memcpy(void* dest, void* scr, size_t sz)
{
	assert(dest && scr);
	while (sz--)
	{
		*(char*)dest = *(char*)scr;
		dest = (char*)dest + 1;
		scr = (char*)scr + 1;
	}
}
int main()
{
	int arr1[10] = { 0 };
	int arr2[] = { 1,2,3,4 };
	my_memcpy(arr1, arr2,16);
	printf("%d %d %d %d", arr1[0], arr1[1], arr1[2], arr1[3]);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

(2) memmove函数

在这里插入图片描述
模拟函数:
在这里插入图片描述

void* my_memmove(void* dest, const void* src, size_t sz)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//前->后
		while (sz--)
		{
		  *(char*)dest = *(char*)src;
	      dest = (char*)dest + 1;
		  src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (sz--)
		{
			*((char*)dest+sz) = *((char*)src + sz);
		}
	}
	return ret;
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr+2, arr, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

(3)memcmp函数

在这里插入图片描述

 int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 
	//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00
	int arr2[] = { 1,2,3,0x11223304 };
	//01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11
	int ret = memcmp(arr1, arr2, 13);
	printf("%d\n", ret);

	return 0;
}

在这里插入图片描述
这也证明了是当前编译器是小端存储

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值