C语言:字符函数和字符串函数

目录

字符分类函数

islower函数

isupper函数

字符转换函数

strlen函数的使用和模拟实现

strlen模拟实现计数器⽅式

strlen模拟实现不能创建临时变量计数器

strlen指针-指针的⽅式

stcpy的使用和模拟实现

stcpy模拟实现

strcat的使用和模拟实现

strcat模拟实现

strcmp的使用和模拟实现

stcmp模拟实现

strncpy函数

strncpy模拟实现

strncat函数

strncat模拟实现

strncmp函数

strncmp模拟实现

strtok函数

strerror函数

strstr函数的使用和模拟实现

strstr函数的模拟实现

​编辑

模拟的strstr


在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。

字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

这里就介绍几个函数吧,用法都是一样的


islower函数

是小写字母将返回大于0的数字

6be48744219f4630966aa57e10d542cd.png


不是小写字母返回0

a46a9694b3884f8d831e34630f341225.png


isupper函数

是大写字母返回大于0的数字

ea5fdca8213848bda105892448e68379.png


不是大写字母返回0

bb6bdfd2a937476aa3775694e6b0b21f.png


字符转换函数

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

小写转大写就是-32

大写转小写就是+32

字符串小写转大写

下面这代码我们可以看到利用islower函数判断是不是小写,是的话利用toupper转大写

当然+32也是可以的

2da41c28fe1449b7a64fd67fe1493986.png


字符串大写转小写

下面这代码我们可以看到利用isupper函数判断是不是小写,是的话利用tolower转小写

当然-32也是可以的

6b7fad6407b94d21bd1be40cbb938a2b.png


strlen函数的使用和模拟实现

需要的头文件:#include<string.h>

https://cplusplus.com/reference/cstring/strlen/?kw=strlen

strlen是计算字符串长度的

2b59cca1ad474f2298d7e9a5c5206f97.png


strlen模拟实现计数器⽅式

利用一个变量来计数

2d16441576b04e07abf0e535813d77d9.png

//计数器
int mn_strlen(char* x)
{
	//计数器
	int num = 0;
	while (*x != '\0')
	{
		num++;
		x++;
	}
	return num;
}
int main()
{
	char arr[] = "asdfsffgdg";
	int r = mn_strlen(arr);
	printf("%d\n", r);
	return 0;
}

strlen模拟实现不能创建临时变量计数器

使用递归方法实现strlen函数

45d35c16faf149e48d0f3c6d3b5f173c.png

//不能创建临时变量计数器
int mn_strlen(char* x)
{
	if (*x == '\0')
	{
		return 0;
	}
	else
	{
		//每次递归,地址往后走,遇到\0回归
		return 1 + mn_strlen(x + 1);
	}
}
int main()
{
	char arr[] = "asdfsffgdg";
	int r = strlen(arr);
	printf("%d\n", r);
	return 0;
}

strlen指针-指针的⽅式

29a69d4d24d5425dba6b5fe88fd1ec90.png

int mn_strlen(char* x)
{
	int* p = x;
	//循环往后到\0
	while (*p != '\0')
	{
		p++;

	}
	//通过后面的地址减去首地址就可以拿到有多少个了
	return p - x;;
}
int main()
{
	char arr[] = "asdfsffgdg";
	int r = strlen(arr);
	printf("%d\n", r);
	return 0;
}

stcpy的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/stcpy/

这个函数是复制字符串

源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷⻉到⽬标空间。
⽬标空间必须⾜够⼤,以确保能存放源字符串。
⽬标空间必须可修改。

3b9b2e5f509642e59a7343934c791366.png


stcpy模拟实现

187362e311694620bc1c51317a7db5ab.png

char* mn_stcpy(char* x, char* y)
{
	while (*y != '\0')
	{
		*x = *y;
		x++;
		y++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = { 0 };
	mn_stcpy(r, arr);
	printf("%s\n", r);
}

strcat的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strcat/

strcat函数就是在字符串后面追加字符串

d0c0cd7ee11d4b688c0524f3ce056899.png


strcat模拟实现

就是先把r往后走到\0停下来,然后arr赋值到r后面

28319235ac1147b4818fe824099b5fe5.png

char* mn_strcat(char* r, char* arr)
{
	//r走到\0的位置
	while (*r != '\0')
	{
		r++;
	}
	//把arr的字符串赋值到r字符串的后面
	while (*arr != '\0')
	{
		*r = *arr;
		r++;
		arr++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = "xxxx ";
	mn_strcat(r, arr);
	printf("%s\n", r);
}

strcmp的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strcmp/

21dd775738c24e9f9cad0ab4990a9fe8.png

strcmp是比较字符串的,当然是一个一个字符比较的

小于就返回小于0的数字

大于就返回大于0的数字

等于返回0

下面这代码我们可以看到s比z小返回-1

比较是通过ASCII码来比较的

ad8bc3f41179405882cd619d6470ba4f.png


stcmp模拟实现

9e13ba0bc54e46e7bd61048b9b01c73b.png

int mn_strcmp(char* x, char* y)
{
	//等于就往后找
	while (*x == *y)
	{
		//x找到\0就说明这2个数组都是一样的
		if (*x == '\0')
		{
			return 0;
		}
		x++;
		y++;
	}
	//小于返回-1
	if (*x < *y)
	{
		return -1;
	}
	//大于返回1
	else
	{
		return 1;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char arr2[] = "asfzdfs";
	int r = mn_strcmp(arr, arr2);
	printf("%d\n", r);
}

strncpy函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncpy/

strcpy是复制整个字符串,str n cpy这个数可以自己指定要复制多少个字符

78078dbdeb554534903245c1d1d655f0.png

e10bd2ac17c447449692b1dff783513e.png


strncpy模拟实现

ccd0e164e6ca448290c47d07037643fd.png

char* mn_strncpy(char* r, char* arr, size_t sz)
{
	while (sz--)
	{
		*r = *arr;
		r++;
		arr++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = {0};
	mn_strncpy(r, arr,3);
	printf("%s\n", r);
}

strncat函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncat/

这个函数可以自己指定要追加多少个字符

aaf34f3d478d4729af42e22d645452aa.png


strncat模拟实现

388b34c3988d4b229fc2ce14475ba196.png

char* mn_strncat(char* r, char* arr, size_t sz)
{
	while (*r != '\0')
	{
		r++;
	}
	while (sz--)
	{
		*r = *arr;
		r++;
		arr++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = "xxxx ";
	mn_strncat(r, arr, 3);
	printf("%s\n", r);
}

strncmp函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncmp/

这个函数可以自己指定要比较多少个字符

24ce1bc6c45344c38fbc5813875241ba.png


strncmp模拟实现

87f662342b9744099f5ff0ef91dc72c6.png

int mn_strncmp(char* x, char* y, size_t sz)
{
	//循环判断x等于y就往后走,不等于就跳出
	while (*x == *y)
	{
		//sz等于0了,就说明这些字符是一样的
		if (sz == 0)
		{
			return 0;
		}
		x++;
		y++;
		sz--;
	}
	//判断大于,小于
	if (*x < *y)
	{
		return -1;
	}
	else
	{
		return 1;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char arr1[] = "asfsdfs";
	int r = mn_strncmp(arr, arr1, 3);
	printf("%d\n", r);
}

strtok函数

https://legacy.cplusplus.com/reference/cstring/strtok/

char * strtok ( char * str, const char * sep); 

strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
• 如果字符串中不存在更多的标记,则返回 NULL 指针。

strtok函数的第⼀个参数不为 NULL ,函数将找到p中第⼀个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标


strerror函数

https://legacy.cplusplus.com/reference/cstring/strerror/

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。


strstr函数的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strstr/

这是一个字符串匹配

int main()
{
	char arr[] = "asdfddds";
	//匹配arr里有没有这个字符串
	char* p = "fdd";
	//没有就返回NULL,有就返回arr的qwe和后面的字符串
	char*r = strstr(arr, p);
	if (r == NULL)
	{
		printf("不存在");
	}
	else
	{
		printf("%s\n", r);
	}
}

strstr函数的模拟实现

main函数


模拟的strstr

我们可以创建是S1和S2这2个指针进行比较

创建sz指针把arr的地址给sz,让sz找\0这样的话,

sz赋值给s1,p赋值给s2

s1有2个相同第3个不同这样的话可以返回回来sz++继续找下一个

s2也是一样第3个不同可以返回回来

char* mn_strstr(char* arr, char* p)
{
	char* s1 = NULL;
	char* s2 = NULL;
	char* sz = arr;
	while (*sz != '\0')
	{
		//赋值给s1和s2去匹配,这样的话s1找不到的话sz赋值回来继续找s2也一样
		s1 = sz;
		s2 = p;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
			//s2的走到\0就说明找到了
			if (s2 == '\0')
			{
				//返回sz的地址
				return sz;
			}
		}
		sz++;
	}
	//找不到返回NULL
	return NULL;
}

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值