【C语言】字符串函数及内存函数的实现

本文详细介绍了C语言中几个基础的字符串处理函数的实现,包括计算字符串长度的my_strlen,复制字符串的my_strcpy和my_strncpy,比较字符串的my_strcmp,连接字符串的my_strcat和my_strncat,以及查找子串的my_strstr。此外,还提供了将字符串转换为整数的my_atoi函数和内存拷贝函数my_memcpy与my_memmove的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍C语言中部分字符串函数及内存函数的实现

strlen

int my_strlen(char* p)
{
	if (*p == '\0')
		return 0;
	else
		return 1 + my_strlen(p + 1);
}

strcpy

char* my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

strncpy

char* my_strncpy(char* dest, const char* src, size_t num)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (num--)
	{
		if ((*src) != '\0')
			*dest++ = *src++;
		else
			*dest++ = 0;
	}
	return ret;
}

strcmp

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);

	while (*str1 == *str2 && *str1 && *str2)
	{
		str1++;
		str2++;
	}
	/*if (*str1 == *str2)
		return 0;
	else*/
		return (*str1 - *str2);
}

strcat

char* my_strcat(char* dest, const char* src)
{
	assert(dest);
	assert(src);

	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

strncat

char* my_strncat(char* dest, const char* src, size_t num)
{
	assert(dest);
	assert(src);

	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (num--)
	{
		if ((*src) != '\0')
			*dest++ = *src++;
		else
		{
			*dest = *src;
			break;
		}
	}
	return ret;
}

strstr

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);

	char* p = str1;
	char* s1 = str1;
	char* s2 = str2;

	while (*s1)
	{
		s1 = str1;
		s2 = str2;
		while (*s1 && *s2)
		{
			p = str1;
			if (*s1 != *s2)
			{
				break;
			}
			else
			{
				s1++;
				s2++;
			}
		}
		if (*s2 == '\0')
			return p;
		str1++;
	}
	return NULL;
}

atoi

enum State
{
	VALID,
	INVALID
}state = INVALID;//全局的状态,它的值标志返回的是合法的值还是异常的值


int my_atoi(const char* str)
{
	int flag = 1;
	assert(str);
	if (*str == '\0')//空字符串
	{
		return 0;
	}
	//跳过空白字符
	while (isspace(*str))
	{
		str++;
	}
	//处理正负号的问题
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
	else if (*str == '+')
	{
		str++;
	}
    //为了进行int最大值和最小值的判断,所以选用longlong类存储ret
	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + flag*(*str - '0');
			//'1'-'0' = 49-48=1
			//'5'-'0' = 5
			if (ret<INT_MIN || ret >INT_MAX)
			{
				return 0;
			}
		}
		else
		{
			return (int)ret;
		}
		str++;
	}
	state = VALID;
	return (int)ret;
}

memcpy

void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);

	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

memmove

void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);

	void* ret = dest;

	//从前往后拷贝
	if ((char*)dest < (char*)src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}

	//从后往前拷贝
	else if ((char*)dest > (char*)src)
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	else
		return ret;
	return ret;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

毕瞿三谲丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值