字符串函数详解

本文介绍了如何用C语言模拟实现常见的字符串处理函数,包括strlen用于计算字符串长度,strcpy用于复制字符串,strcat用于字符串追加,strcmp用于字符串比较,strstr用于查找子字符串,以及strtok和strerror、perror用于字符串拆分和错误处理。这些函数是C语言编程中的基础工具。
摘要由CSDN通过智能技术生成

1,strlen

strlen - 求字符串长度
strlen返回的是字符串中’\0’之前出现的字符个数且不包括’\0’
在这里插入图片描述
在这里插入图片描述

1.1模拟实现strlen

int my_strlen(const char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

第二种方法是不使用变量

int my_strlen(const char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
	{
		return 0;
	}
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

我们字符串长度一定是大于1的所以是1+
my_strlen(str + 1):str+1判断第一个字符之后的字符

2,strcpy

copy顾名思义就是字符串拷贝。
在这里插入图片描述
在这里插入图片描述

2.1模拟实现strcpy

#include<assert.h>
char* my_strcpy(char* dest, const char* source)
{
	char* ret = dest;
	assert(dest && source);
	while (*dest++ = *source++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = { 0 };
	my_strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

3,strcat

strcat-追加字符串
在这里插入图片描述

3.1模拟实现strcat

#include<assert.h>
char* my_strcat(char* dest, const char* source)
{
	assert(dest && source);
	char* ret = dest;
	while(*dest != '\0')
	{
		dest++;
	}
	while (*dest = *source)
	{
		dest++;
		source++;
	}
	return ret;
}
int main()
{
	char arr[100] = "your ";
	char arr2[] = "boss";
	my_strcat(arr, arr2);
	printf("%s", arr);
	return 0;
}

先找到需要追加字符串的’\0’, 然后再把追加的字符串一 一追加进去。

4,strcmp

strcmp-比较字符串
在这里插入图片描述
在这里插入图片描述
因为g比b的ascll码大所以输出1。

4.1模拟实现strcmp

int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 > *str2)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}
int main()
{
	char arr[] = { "your" };
	char arr2[] = { "your" };
	int ret = my_strcmp(arr, arr2);
	printf("%d", ret);
	return 0;
}

5,strstr

strstr - 查找子字符串
在这里插入图片描述
abcdef 在a后三个字符与bcd相同所以输出bcdef。如果找到多次相等,也只会返回第一次的地址。

5.1模拟实现strstr

首先我们要知道最后的输出是第一次相同的地址开始,所以我们不能用str1 和str2进行遍历,而且str1的变量需要多一个,用来记第一次相同的地址

	char* p1 = NULL;
	char* p2 = NULL;
	char* pc = (char*)str1;

arr1[] = “abcdef”;
arr2[] = “bcd”;
当我们p1 == p2时,p1++,p2++。如果p1 != p2,pc++。
在这里插入图片描述
然后再一次进入循环,pc只有当p1与p2不相等时才加加,所以遍历是p1来完成的,那p1 = pc就能很好的解决,
总循环的条件就是*pc != ‘\0’,这是大致的思路。

char* my_strstr(const char* str1, const char* str2)
{
	char* p1 = NULL;
	char* p2 = NULL;
	char* pc = (char*)str1;
	while (*pc != '\0')
	{
		p1 = pc;
		p2 = (char*)str2;
		while (*p1 && *p2 && *p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
		{
			return pc;
		}
		pc++;
	}
	return NULL;
}
int main()
{
	char arr1[] = { "abbbcde" };
	char arr2[] = { "bcd" };
	char* p = my_strstr(arr1, arr2);
	if (p == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", p);
	}
	return 0;
}

对于*p1 && *p2 && *p1 == *p2

*p1 == '\0'*p2 == '\0'

都能使while停止

if (*p2 == '\0')
		{
			return pc;
		}

当*p2 == ‘\0’,说明arr2[] = “bcd”;已经找完了,况且已经找到字符串。直接return就好了。
最后如果找不到,直接return空指针。

6,strtok

strtok-拆分字符串
在这里插入图片描述
看到这大家就懂什么意思了吧
在这里插入图片描述
在这里插入图片描述

7,strerror 与 perror

7.1strerror - 获取指向错误消息字符串的指针

在这里插入图片描述
在这里插入图片描述
这里就会显示没有这个文件,因为我根本没创建。也会告诉你为什么出的错误。

7.2 perror - 打印错误信息

在这里插入图片描述

7.3 两者区别

perror 相当于 printf + strerror

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阔步昂首

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值