字符串相关函数(二)

1.前言💬

因为学校期末考试,时隔十一天才着手写这篇博客,上一篇博客介绍了字符串相关函数的一部分及实现,本篇则介绍剩余的字符串函数以及内存函数等
在这里插入图片描述

2.字符串函数💬

2.1strtok👾

在这里插入图片描述
strtok是一个字符串分割的一个函数,通过设定的分割赋从而将一个字符串分割成不同的字符串。

在这里插入图片描述
其用法规则如上图所示,看起来比较拗口繁琐,接下来我用例子直接进行演示:

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "kkk@kkkkk@qq.com.com";
	const char *sep = "@.";
	char str1[30];
	//因为strtok会改变被操作的字符串,所以我进行临时拷贝
	strcpy(str1, str);
	//1.kkk
	char* ch = strtok(str1, sep);
	printf("%s\n", ch);
	//2.kkkkk
	ch = strtok(NULL, sep);
	printf("%s\n", ch);
	//3.qq
	ch = strtok(NULL, sep);
	printf("%s\n", ch);
	//4.com
	ch = strtok(NULL, sep);
	printf("%s\n", ch);
	//5.com
	ch = strtok(NULL, sep);
	printf("%s\n", ch);
}

调试结果如下:
在这里插入图片描述
调试结果如图所示,每找到一个标记后会将这个标记换成‘\0’,并保存这个标记位置,供下一次参数为NULL时查找其他分隔符。

改进:

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "kkk@kkkkk@qq.com.com";
	const char *sep = "@.";
	char str1[30];
	//因为strtok会改变被操作的字符串,所以我进行临时拷贝
	strcpy(str1, str);
	char* ch = NULL;
	for (
	        ch = strtok(str1, sep); 
	        ch != NULL; 
	        ch = strtok(NULL, sep)
	    )
	{
		printf("%s\n", ch);
	}
}

2.2strerror👾

在这里插入图片描述
是一个返回错误码,报告程序中错误信息的一个函数。

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	FILE* pf;
	pf = fopen("test.txt", "r");
	printf("%s", strerror(errno));
	//errno需要引头文件#include<errno.h>
	return 0;
}

在这里插入图片描述
结果如上,会使用即可!

3.内存操作函数💬

3.1memcmp👾

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

int main()
{
	int arr1[] = { 1,2,3,4,5,7,7,7,10 };
	int arr2[] = { 1,2,3,4,8,9,10,11,12 };
	printf("整形数组比较:\n");
	printf("%d\n", memcmp(arr1, arr2, 16));
	printf("%d\n", memcmp(arr1, arr2, 28));

	printf("字符串比较:\n");
	char str1[] = "abcdefgh";
	char str2[] = "abcdxxxx";
	printf("%d\n", memcmp(str1, str2, 4));
	printf("%d\n", memcmp(str1, str2, 6));
	return 0;
}

在这里插入图片描述

3.2memcpy👾

在这里插入图片描述
memcpy是字节拷贝函数,同strcpy用法一致,参数意义与*memcmp大致一样,在此就不进行赘述了,接下来直接实现memcpy函数

void* my_memcpy(void* dest, const 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()
{
	char str1[30] = { 0 };
	char str2[] = "abcdefg";
	my_memcpy(str1, str2, 6);
	printf("%s\n", str1);

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

在这里插入图片描述
如果我们这样调用函数呢?

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

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

3.3memmove👾

在这里插入图片描述
memmove就是用来处理赋值时地址重叠的问题的一个库函数,也是与strcpy的意义一致,用来复制数据,不过它处理的是空间重叠时的数据复制;具体测试在这就不进行演示了,可以参考memcpy的地址重叠进行测试用例!

void* my_memmove(void* dest, const 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 arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	char str[] = "abcdefxxxxx";
	my_memmove(str, str + 6, 5);
	printf(str);
	return 0;
}

在这里插入图片描述

3.4memset👾

在这里插入图片描述
memset是一个初始化函数;value是初始化的数值,num是字节,该函数其实时对每一个字节进行初始化赋值。

int main()
{
	char str1[10];
	int arr1[10];
	memset(str1, 0, 10);
	memset(arr1, 0, 40);
	return 0;
}

在这里插入图片描述

Ending💬

本次博客到这里就全部结束了,也就将字符串相关函数也就大概罗列完成,就这样吧🙋‍♂️🙋‍♂️
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kkkkvvvvvxxx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值