c语言学习第二十七课 ——一些内存函数与字符串函数

目录

strtok函数

strerror函数

内存函数

memcpy

memmove

memcmp

 memset


strtok函数

 char* strtok(char *str,char *sep)
返回的是分割符标记的起始位置
函数作用   给一个邮箱  [email protected]           @ 。被叫做分割符
该函数作用就是提取这些分割符。
第一的参数为字符串,sep参数是个字符串,定义了用做分割符字符的集合

c语言学习第二十七课 ——一些内存函数与字符串函数_第1张图片  例如

int main()
{
	char arr[] = " [email protected] ";
	const char* p = "@.";
	char bufer[30] = { 0 };
	char* str = strtok(bufer, p);
	strcpy(bufer, arr);
	//该函数会改变字符串中的分隔符为\0;
	strtok(bufer, p);
	//strtok传的第一个参数不为空指针时,读入,当遇到分割符时,变为\0,切割掉返回空指针,保c存分割符的位置,继续进行切割,寻找下一个分割符
	//常量i昂字符无法修改
	strtok(NULL, p);
	printf("%s\n", str);
	strtok(NULL, p);
	printf("%s\n", str);
	strtok(NULL, p);
	printf("%s\n", str);
	//
	char* str = NULL;
	for (str = strtok(bufer, p); str= NULL;str = strtok(NULL,p))
	{
		printf("%s\n", str);
	}
	return 0;
}

strerror函数

 

 返回错误码所对应的错误信息
char *strerror()
每一个错误码都有错误信息
c语言的库函数再调用失败的时候,会将一个错误码存放在一个叫error的变量中,当我们想知道调用库函数的时候发生了什莫错误,就可以把error里的错误码翻译为错误信息。 例

int main()
{
	char* p = strerror(0);
	printf("%s\n", p);

	char* p = strerror(1);
	printf("%s\n", p);

	char* p = strerror(2);
	printf("%s\n", p);

	char* p = strerror(3);
	printf("%s\n", p);

	return 0;

}

举例打印文件打开错误

int main()

{
	//打开文件
	FILE* p = fopen("text.txt", "r");//如果打开方式是“r”,若文件存在则打开成功,否则失败
	//这里未建立这样的文件
	if (p == NULL)
	{
		printf("打开失败,原因是%s\n",strerror(errno));//显示错误 errno中把错误码翻译成错误信息

		//perror函数  打印错误信息
		//perror("文件打开失败");把定义的错误信息后在打印错误信息,可以理解为printf+strerror结合函数。

	}
	//读写文件
	//关闭文件
	fclose(p);
	p = NULL;
	return 0;
}

这里还有许多常用的字符判断函数。其用法相似。

c语言学习第二十七课 ——一些内存函数与字符串函数_第2张图片

isdigit

 c语言学习第二十七课 ——一些内存函数与字符串函数_第3张图片

 isspace     isxdigit   islower  issupper    isalpha   isaipha等的函数.

内存函数

不同于字符串函数,这里可以实现各种类型的数据的函数。

memcpy

 c语言学习第二十七课 ——一些内存函数与字符串函数_第4张图片

例如

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
	int arr2[] = { 0 };
	
	//memcpy,拷贝数据
	memcpy(arr2, arr1, 20);//把arr1中的5个整形拷贝到arr2中 , size_t num为所拷贝数据内存大小,

    float arr1[] = { 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0 };
	float arr2[] = {0.0};
	memcpy(arr2, arr1, 12);//把arr1中的5个整形拷贝到arr2中 
	return 0;



}

函数实现


void* my_memcpy(const void*str,const void *ptr,size_t num)

{
	void* ret = str;
	assert(str && ptr);//断言判断是否为指针
	while (num--)
	{
       *(char*)str = *(char*)ptr;
	   str = (char*)str + 1;
	    ptr = (char*)str + 1;
	}
	return ret;
}

在内存重叠时使用memcpy可能出现其他结果,这时使用memmove,不会重现重叠,数据覆盖

例如   

memmove


void* memmove(void* destinnation, void* source, size_tnum)

 c语言学习第二十七课 ——一些内存函数与字符串函数_第5张图片

int main()
{
	int  arr1[] = {1,2,3,4,5,6,7,8,9};
	int  arr2[] = { 1,2 };
	memmove(arr2+2, arr1, 12);//把arr1中的5个整形拷贝到arr2中 
	return 0;
}

函数实现

void* my_memmove(const void* str, const void* ptr, size_t num)
{
	//从前往后拷贝和从后往前拷贝
	//分情况讨论
	//当strptr  从后往前拷贝
	assert(str && ptr);
	void* ret = str;
	if (str < ptr)
	{   
		
		*(char*)str = *(char*)ptr;
		str = (char*)str + 1;
		ptr = (char*)str + 1;
	}
	else
	{
		//后->前
		while (num--)
		{
			*((char*)str + num) = *((char*)ptr + num);
		}
	}


	return ret;
}

这里存在分情况讨论是因为如图

c语言学习第二十七课 ——一些内存函数与字符串函数_第6张图片

 

memcmp

 

void test()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int arr1[] = { 1,2,4,6 };
	int ret = memcmp(arr,arr1, 16);
	printf("%d\n", ret);
}

 memset

 

你可能感兴趣的:(c++,算法,开发语言)