『C语言进阶』字符函数和内存函数(2)

在这里插入图片描述
博客主页 小羊失眠啦.
系列专栏 C语言LinuxCpolar
❤️感谢大家点赞收藏⭐评论✍️


在这里插入图片描述

文章目录

  • 一、strtok函数
    • 1.1 函数认识
    • 1.2 注意事项
  • 二、strerror函数
    • 2.1 函数认识
    • 2.2 注意事项
  • 三、memcpy函数
    • 3.1 函数认识
    • 3.2 注意事项
    • 3.3 模拟实现
  • 四、memmove函数
    • 4.1 函数认识
    • 4.2 注意事项
    • 4.3 模拟实现
  • 五、memcmp函数
    • 5.1 函数认识
    • 5.2 模拟实现
  • 六、memset函数
    • 6.1 函数认识
    • 6.2 注意事项
  • 七、字符分类函数
  • 八、字符转换函数

一、strtok函数

1.1 函数认识

在这里插入图片描述
函数功能:
将字符串拆分为标记
strtok函数的应用:

#include
#include
int main()
{
	const char* p = "@.";
	char arr[] = "[email protected]";
	char buf[100] = { 0 };//因为字符串会被修改,所以要把arr临时拷贝到buf里
	//保证arr不被修改
	strcpy(buf, arr);
	char* str = strtok(buf, p);
	printf("%s\n", str);
	str = strtok(NULL, p);
	printf("%s\n", str);
	str = strtok(NULL, p);
	printf("%s\n", str);
	return 0;
}

『C语言进阶』字符函数和内存函数(2)_第1张图片

更方便的代码展示:

#include
#include
int main()
{
	const char* p = "@.";
	char arr[] = "[email protected]";
	char buf[100] = { 0 };//因为字符串会被修改,所以要把arr临时拷贝到buf里
	//保证arr不被修改
	strcpy(buf, arr);
	char* str = NULL;
	for (str = strtok(buf, p); str != NULL; str = strtok(NULL, p))
	{
		printf("%s\n", str);
	}
	return 0;
}

1.2 注意事项

  • delimiters参数是个字符串,定义了用作分隔符的字符集合

  • 第一个参数指定一个字符串,它包含了0个或者多个由delimiters字符串中一个或者多个分隔符分割的标记

  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)

  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置

  • strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记

  • 如果字符串中不存在更多的标记,则返回NULL指针


二、strerror函数

2.1 函数认识

在这里插入图片描述

函数功能:

返回错误代码,所对应的错误信息(把错误代码翻译成错误信息)

C语言中规定了一些信息
错误码——错误信息
0——No Error
1——……
2——……

当库函数使用的时候,发生错误的时候会把errno这个全局的错误变量设置为本次执行库函数产生的错误码。
errno是C语言提供的全局变量,可以直接使用,放在errno.h这个文件
所以要引用#include
strerror(errno);就会把错误显示出来

头文件:

#include

strerror函数的使用:

#include
int main()
{
	FILE* pf = fopen("date.txt", "r");
	if (pf == NULL)
	{
		//printf("%s\n", strerror(errno));
		perror("fopen");
		return 1;
	}
	return 0;
}

在这里插入图片描述

2.2 注意事项

报错的是程序运行过程中的运行的错误


三、memcpy函数

3.1 函数认识

在这里插入图片描述

函数功能:

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

头文件:

#include

memcpy函数的使用:

#include
int main()
{
	char arr1[] = "abcdef";
	char arr2[50] = { 0 };
	strcpy(arr2, arr1);
	int arr3[] = { 1,2,3,4,5,6,7 };
	int arr4[5] = { 0 };
	memcpy(arr4, arr3, 20);
	for (int i = 0; i < 5; i++)
		printf("%d ", arr4[i]);
	return 0;
}

在这里插入图片描述

C语言只要求memcpy能拷贝不重叠的内存空间就足够了,memmove去处理那些重叠的内存空间,但是VS的memcpy可以处理重叠的内存拷贝,也可以处理不重叠的内存拷贝

3.2 注意事项

  • 这个函数在遇到’\0’的时候并不会停下来
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。如果destination在source的后面,就可能导致刚改变的destination的内容,又变成了source,就会导致重复,这种情况建议使用memmove就不会发生

3.3 模拟实现

#include 
#include 
#include  
 
void* my_memcpy(void* dest, const void* src, int num)
{
	assert(dest && src);
	void* ret = dest;
	while (num--)
	{
		*(char*)dest =  *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}
 
int main()
{
	int arr1[5] = { 0 };
	int arr2[] = { 1,2,3 };
	my_memcpy(arr1, arr2, 12);
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
}

注意:

可以拷贝整型,也可以拷贝浮点型,所以用void*来接收


四、memmove函数

4.1 函数认识

在这里插入图片描述

函数功能:

从source的位置开始向后复制num个字节的数据到destination的内存位置,允许source和destination重叠

头文件:

#include

memmove函数的应用:

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

4.2 注意事项

  • 为避免溢出,目标参数和源参数指向的数组的大小应至少为字节数
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理

4.3 模拟实现

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

五、memcmp函数

5.1 函数认识

在这里插入图片描述

函数功能:

比较从ptr1和ptr2指针开始的num个字节

返回值:

返回值 表明
<0 两个内存块中不匹配的第一个字节在PTR1中的值低于PTR2中的值(如果评估为无符号字符值)
0 两个内存块的内容相等
>0 两个内存块中不匹配的第一个字节在PTR1中的值大于PTR2中的值(如果评估为无符号字符值)

头文件:

#include

memcmp函数的应用:

#include
#include
int main()
{
	int arr1[] = { 1,2,1,5,4 };
	int arr2[] = { 1,2,257 };
	int ret = memcmp(arr1, arr2, 9);
	printf("%d\n", ret);
	return 0;
}

5.2 模拟实现

#include 
#include 
#include 
 
int my_memcmp(const void* s1, const void* s2, int num)
{
	assert(s1 && s2);
	char* str1 = (char*)s1;
	char* str2 = (char*)s2;
	int i = 0;
	for (i = 0; i < num; i++)
	{
		if (*(str1 + i) != *(str2 + i))
		{
			return (*(str1 + i) - *(str2 + i));
		}
	}
	return 0;
}
 
int main()
{
	int arr1[] = { 1,2,3,5,4 };
	int arr2[] = { 1,2,257 };
	int ret = my_memcmp(arr1, arr2, 9);
	printf("%d\n", ret);
	return 0;
}

六、memset函数

6.1 函数认识

在这里插入图片描述

函数功能:

将ptr指向的前num个字节设置为value值

头文件:

#include

memset函数的应用:

#include
#include
int main()
{
	char arr[] = "hello word";
	memset(arr, 'x', 2);
	printf("%s\n", arr);
	return 0;
}

6.2 注意事项

  • 要设置的值。该值作为 int 传递,但该函数使用此值的无符号char转换填充内存块
  • 以字节为单位来设置

七、字符分类函数

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A~F
islower 小写字母a~z
isupper 大写字母A~Z
isalpha 字母a-z或A~Z
isalnum 字母或者数字,a-z,A-Z,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph 任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

八、字符转换函数

int tolower(int c); 大写——>小写

int toupper(int c); 小写——>大写

#include
int main()
{
	char ch = 0;
	ch = getchar();
	if (islower(ch))
		ch = toupper(ch);
	else
		ch = tolower(ch);
	printf("%c\n", ch);
	return 0;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位铁汁们的支持。文章有任何问题可以在评论区留言,小羊一定认真修改,写出更好的文章~~
在这里插入图片描述

你可能感兴趣的:(C语言,c语言,数据库,服务器)