字符串和内存函数的介绍(3)

2.字符函数和字符串函数

2.1函数介绍

2.1.10strerror

char* strerror(int errnum)

返回错误码,转换为所对应的错误信息
获得指针指向错误信息,C语言的库函数在运行的时候,如果发生错误,就会将错误码存在一个变量中,这个变量是:errno(全局变量)。
错误码是一些数字:1 2 3 4 5,
需要将错误码翻译成错误信息。


#include 
#include 
int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));
	printf("%s\n", strerror(5));
	printf("%s\n", strerror(6));
	return 0;
}

字符串和内存函数的介绍(3)_第1张图片
每一个错误码对应一个错误信息
strerror把错误码所对应的错误信息这个字符串首字符的地址返回

#include //引用头文件
#include 
int main()
{
 //打开文件
 FILE *PF= fopen(“test.txt","r");
 if(pf==NULL)
 {
   //printf("%s\n",strerror(errno));//通过strerror函数把错误码转换为错误信息
   perror("fopen");//找到错误信息并直接打印
   return 1;
 }
 //读文件
 //关闭文件
 fclose(pf);
  }

fopen

FILE *fopen(const char * filename,const char *mode)//文件名与打开方式

如果打开文件成功,返回一个有效指针
打开失败,返回一个NULL指针
只转换,不打印

perror
打印错误信息

void perror(const char *str);

在打印之前可以打印一些自定义信息
perror=printf+strerror
方便但不灵活。。。
包含的是#include

2.1.10.1字符分类函数

*字符分类函数 *

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

需要的头文件:#include

is ret=islower('A');//返回a

字符转换:只针对字母
int tolower(int c);大写字母转小写
int toupper(int c);与之相反
//转换字符可以是ASC11也可以是字符
//I Have An Apple
//大写转小写

int main()
{ 
 char arr[]="I Have An Apple";
 int i=0;
 while(arr[i])//用i来遍历
 {
  if(is_upper(arr[i]))
  {
  printf("%c",tolower(arr[i]));
  }
  else
   {
     printf("%c",arr[i]);
   }
   //if(is_upper(arr[i]))
  //{
  //arr[i]=tolower(arr[i]));
  //}
  //printf("%c",arr[i]);
  i++;
  }
  return 0;
  }

2.2针对内存memcpy memmove memcmp memset

2.2.1 memcpy

strcpy-仅字符串拷贝

void*memcpy(void*destination,const void *source,size_t num);

内存拷贝,可能拷贝整型数组,浮点型数组,任意数组
num:从源头拷贝到目的地中,需拷贝几个字节
num是拷贝字节个数


#include 

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	//前->后
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

test1()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	//内存拷贝-memcpy
	//    int*   int*
	my_memcpy(arr2, arr1 + 2, 17);
	//01 00 00 00 02 00 00 00 03 00 00 00
}
34567拷贝到12345上去
void test2()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memcpy(arr1+2, arr1, 20);//有bug,内存重叠了
	//拷贝20个字节
}

//从后向前拷贝就不会出现重叠这种有点绝对,提供memmove实现重叠内存拷贝

2.2.2memmove

字符串和内存函数的介绍(3)_第2张图片


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;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);//源头的二十个字节放到目标的20个字节中
		}
	}

	return ret;
}


void test3()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1+2, arr1, 20);//34567678910
}

memmove功能更加强大

2.2.3memcmp

用来比较

int memcmp(const void *ptr1,const void*ptr2,size_t num);

比较prt1和ptr2指针开始的num个字节
返回值:

0
0
<0

int main()
{
	int arr1[] = { 1,2,6 };//01 00 00 00 02 00 00 00 06 00 00 00
	int arr2[] = { 1,2,5 };//01 00 00 00 02 00 00 00 05 00 00 00
	int ret = memcmp(arr1, arr2, 9);
	printf("%d\n", ret);//1

	return 0;
}

2.2.4memset

void*memset(void*ptr,int value,size_t num);

设置从ptr开始的num个字节,把他的内容设置成value
memset:内存设置函数,将内存设置为自己想要的内容
字节为单位设置内存中的数据

int main()
{
	//char arr[] = "hello world";
	//memset(arr, 'x', 5);
	//printf("%s\n", arr);
	//memset(arr+6, 'y', 5);//hello yyyyy
	//printf("%s\n", arr);

	int arr[10] = { 0 };
	memset(arr, 0, 40);//40字节均改为00

	return 0;
}

OVER

你可能感兴趣的:(c语言,学习)