字符串和内存相关函数的实现

本文详细介绍了C语言中常用的字符串处理函数:strlen计算字符串长度,strcpy复制字符串,memmove与memcpy数据移动,strstr查找子串,strcat连接字符串,以及strcmp字符串比较。通过模拟实现,展示了这些函数的工作原理和应用场景。

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

strlen函数

函数声明

size_t strlen(const char*string)

用于计算字符串的长度(不包括\0),返回值为size_t类型,返回字符串的长度(不包括\0)
模拟实现strlen
使用计数器的方法模拟实现

size_t My_strlen(const char* str) {
	assert(str != NULL);
	int count=0;
	while (*str!= '\0') {
		str++;
		count++;
	}
	return count;
}
int main() {
	char str[]= "abcde";
	printf("%d", My_strlen(str));
}

运行结果
在这里插入图片描述

strcpy函数

函数声明

char* strcpy(char* dest,const char* src)

功能为将src字符串拷贝到dest中(\包括字符串结束符),dest的空间要足够大能容纳下src的内容,防止溢出。
模拟实现strcpy

char* My_strcpy(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	while (*src != '\0') {
		*dest = *src;
		dest++;
		src++;
	}
	return dest;
}
int main() {
	char dest[1024] = " ";
	char src[100] = "abcde";
	printf("%s", My_strcpy(dest, src));
}

运行结果:
在这里插入图片描述

memmove函数

函数声明:

void* memmove(void* dest,const void* src,size_t num)

用于从src中拷贝num个任意类型内容到dest,若目标区域和源区域有重叠,memmove你能保证在源串被覆盖前将重叠部分拷贝到目标区域。由于现在计算机当中几乎不会出现内存重叠的现象,所以极少被用到。
模拟实现memmove

void* My_memmove(void* dest, const void* src, size_t num) {
	assert(dest!= NULL);
	assert(src != NULL);
	char* p1 = (char*)dest;
	char* p2 = (char*)src;
	void* p = p1;
	if (p1>= p2 && p1 < (p2 + num)) {
		p1 = p1 + num - 1;
		p2 = p2 + num - 1;
		while (num--) {
			*p1 = *p2;
			p1--;
			p2--;
		}
	}
	else {
		while (num--) {
			*p1 = *p2;
			p1++;
			p2++;
		}
	}
	return p;
}
int main() {
	char str[] = "aaa bbb ccc ddd eee fff ";
	printf("%s", My_memmove(str+8, str, 11));
}

运行结果:
在这里插入图片描述

memcpy函数

函数声明:
void* memcpy(void* dest,const void* src,size_t num)
函数的功能是从src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
模拟实现memcpy

void* My_memcpy(void* dest,const void* src,size_t num) {
	assert(dest != NULL);
	assert(src != NULL);
	char* p1 = (char*)dest;
	char* p2 = (char*)src;
	while (num != 0) {
		*p1 = *p2;
		p1++;
		p2++;
		num--;
	}
	return dest;
}
int main() {
	char dest[50]=" ";
	char src[] = "abcdefg";
	printf("%s", My_memcpy(dest, src, 7));
}

运行结果:
在这里插入图片描述

strstr函数

函数声明:

char* strstr(const char* str1,const char* str2)

strstr函数用于找到字串str2在字符串str1中第一次出现的位置,如果未找到则返回NULL,找到了返回str2在str1中第一次出现的地址。
模拟实现strstr

char* My_strstr(const char* str1,const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* p1 = str1;
	char* p2 = str2;
	char* head = p1;
	char* n = p2;
	int count=0;
	while (1) {
		if (*p1 != *p2) {//str1=abcdef,str2=cde
			if (count == 1) {
				return NULL;
			}
			p1++;  
		}
		while (*p1 == *p2) {
			if (count == 0) {
				head = p1;
				count = 1;
			}
			p1++;
			p2++;
			if (*p1 == '\0') {
				if (*p2 =='\0') {
					return head;

				}
				return NULL;
			}
			if (*p2 == '\0') {
				return head;
			}
			
		}
		p2 = n,count=0;
	}
}
int main() {
	char str1[] = "abcbcdef";
	char str2[] = "cde";
	printf("%s", My_strstr(str1, str2));
}

运行结果:
在这里插入图片描述

strcat函数

函数声明:

char* strcat(char* dest,const char* src)

功能为在字符串dest后拼接上字符串src,dest的空间必须足够大能够容下拼接后的大小。
模拟实现strcat

char* My_strcat(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	int* p = dest;
	while (*dest != '\0') {
		dest++;
	}
	while (*src != '\0') {
		*dest = *src;
		dest++;
		src++;
	}
	return p;
}
int main() {
	char dest[60] = "i am ";
	char src[] = "iron man";
	printf("%s", My_strcat(dest, src));
}

运行结果:
在这里插入图片描述

strcmp函数

函数声明:

extern int strcmp(const char* str1,const char* str2)

用于比较两个字符串并根据比较结果返回整数。当str1<str2时,返回为负数;当str1=str2时,返回值= 0;当str1>str2时,返回正数。两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
模拟实现strcmp

int My_strcmp(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2) {
		if (*str1 == '\0') {
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2 ;
}
int main() {
	char str1[] = "abcdef";
	char str2[] = "bbcdef";
	printf("%d",My_strcmp(str1,str2) );
}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值