字符串函数和内存函数

本文介绍了C语言中的字符串函数,包括strlen计算字符串长度、strcpy和strcat用于字符串拷贝与追加、strcmp进行字符串比较、以及内存操作函数如memcpy、memmove和memcmp。还提到了strlen的模拟实现和注意事项。
摘要由CSDN通过智能技术生成

字符串函数

求字符串函数(strlen)

头文件:string.h

字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')

注意函数的返回值为size_t,是无符号的

学会strlen函数的模拟实现:

1.创建临时变量

int make_strlen(char* str)
{
	int a = 0;
	while (*str != '\0')
	{
		a++;
		str++;
	}
	return a;
}

int main()
{
	char arr[] = "abc";
	int len = make_strlen(arr);
	printf("%d", len);
	return 0;
}

2.递归(不创建临时变量)

int make_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + make_strlen(str + 1);
	}
	return 0;
}


int main()
{
	char arr[] = "abc";
	int len = make_strlen(arr);
	printf("%d", len);
	return 0;
}

拷贝字符串strcpy

头文件:string.h

strcpy(目标数组,源数组):把源字符串里面的东西拷贝到目标数组里面

不能这样写:char arr1[20]=arr2,这样无法将arr2中的字符转移

源字符串必须以\0结束,会将源字符串中的\0拷贝到目标空间,目标空间必须足够大,目标空间必须可变

模拟实现strcpy

char* make_strcpy(char* str1, char* str2)
{
	char* a = str1;
	while (*str1++  = *str2++)
		//\0为假。当str2的\0赋给str1后,while判定为假跳出
	{
		;
	}
}


int main()
{
	char arr[] = "abc";
	char crr[] = "def";
	make_strcpy(arr, crr);
	printf("%s", arr);
	return 0;
}

追加字符串strcat

strcat(arr1,arr2)把源字符串追加在目标字符串后面,覆盖目标字符串的第一个\0

源字符串必须足够大,能容纳下源字符串的内容,目标空间必须可修改

strcat不能自己给自己追加,而strncat可以

模拟实现

void make_strcat(char* str1, char* str2)
{
	while (*str1)
	{
		str1++;
	}
	while (*str2)
	{
		*str1++ = *str2++;
		
	}
	*str1 = *str2;

}

int main()
{
	char arr1[20] = "abcdefg";
	char arr2[] = "123";
	make_strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

字符串比较strcmp

strcmp(arr1 , arr2)

arr1和arr2一个一个字符来比,若arr1第一个不同的字符的ASCII码值大于arr2则返回一个大于0的数字,小于则返回一个小于0的数字,若完全相等则返回0。

模拟实现:

长度受限

长度受限字符串函数:strcpy,strcat,strcmp

长度不受限函数:strncpy,strncat,strncmp

strstr

strstr(arr1, arr2)在arr1中找arr2这个字符串,若找不到则返回空指针NULL,否则返回arr1中arr2的第一个字符的地址

strtok

strerror

返回错误码,所对应的错误信息

c语言的库函数在调用失败的时候,会将一个错误码存放在一个叫:errno的变量中,当我们想知道调用库函数的

时候发生了什么错位信息,就可以将:errno中的错误码翻译成信息

字符分类函数

内存函数

memcpy

memcpy(void* ptr1 , void* ptr2 , size_t num)

void*指针不能直接用,需强制转换成其他,num这里的单位是字节

和strcpy相似,但strcpy只能拷贝字符串,而memcpy可以拷贝任何

memmove

memmove(void* ptr1 , void* ptr2 , size_t num)

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的 

memcmp

memcmp(void* ptr1 , void* ptr2 , size_t num)

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

如图,此处arr1最后一个字节比arr2大,返回一个大于0的数字,反之返回一个小于0的数字,相等则返回0

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值