一、函数介绍

1.strtok

字符串切割

注意:1.会破坏切割的字符串

     2.找完第一个符号之后,后面的传参要给切割的字符串赋NULL指针

//strtok - 字符串切割函数

int main()
{
	char arr[] = "chai@hsshf.hkh";
	char* p = "@.";
	
	char buf[1024] = {0};
	strcpy(buf, arr);
	char* ret = NULL;
	
	for(ret = strtok(arr, p); ret; ret = strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	strtok(arr, p);
	
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

2.strerror

翻译错误信息

当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,

赋值到errno中,必须包含头文件<errno.h>

#include <errno.h>

//errno 是一个全局的错误码的变量
//当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中
int main()
{
	
	char* str = strerror(2);
	printf("%s\n", str);
	
	FILE* pf = fopen("text.txt", "r");
	
	if(!pf)
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
		printf("open file success\n");
	}
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

3.字符转换函数举例

int main()
{
	int i = 0;
	while(arr[i])
		char arr[] = "I AM A Student";
	{
		if(isupper(arr[i]))
		{
			arr[i] = tolower(arr[i]);
		}
		i++;
	}
	printf("%s\n", arr);
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

4.memcpy

内存拷贝函数 拷贝内部元素有关联(重叠)的话会出错

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while(num--)
	{
		*(char*)dest = *(char*)src;//一个一个字节拷贝
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}

struct s
{
	char name[20];
	int age;
};

int main()
{
	int arr1[] = {1, 2, 3, 4, 5};
	int arr2[5] = {0};
	my_memcpy(arr1, arr2, sizeof(arr1));
	
//	struct s arr3[] = {{"张三", 20}, {"李四", 30}};
//	struct s arr4[] = {0};
//	memcpy(arr3, arr4, sizeof(arr3));
	
	struct s arr3[] = {{"张三", 20}, {"李四", 30}};
	struct s arr4[] = {0};
	my_memcpy(arr3, arr4, sizeof(arr3));

	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

5.memmove

内存拷贝 解决内部重叠的问题

void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	
	assert(dest && src);
	
	if(dest < src)
	{
		while(num--)
		{
			*(char*)dest = *(char*)src;//一个一个字节拷贝
			++(char*)dest;
			++(char*)src;//++优先级高,所以改成前置++,先转换再++.
		}
	}
	else
	{
		while(num--)
		{
			*((char*)dest + num)= *((char*)src + num);			
		}
	}
	
	return ret;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

6.memcmp

内存比较,以字节为单位

int main()
{
	int arr1[] = {1, 2, 3, 4, 5};
	int arr2[] = {1, 2, 5, 4, 3};
	int ret = memcmp(arr1, arr2, 9);//比较字节的个数
	printf("%d\n", ret);
	
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

7.memset

内存设置函数,给内存中加入字符或数字等等

int main()
{
	char arr[10] = " ";
	memset(arr, '#', 10);
	
	printf("%s\n", arr);
	
	return 0;
	
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.