2021-08-14,字符串函数剖析与内存函数

本文详细介绍了C语言中<string.h>库的常用字符串和内存操作函数,包括strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp等的使用及自定义实现。同时,也涵盖了内存函数memcpy、memmove、memcmp和memset的讲解。通过对这些基本函数的理解和实践,有助于提升C语言编程能力。

@[TOC]字符串函数剖析) 标题

对于c语言中#include<string.h>,包含了许多的函数,接下来我将要介绍几种常用的库函数,并将他们用自己的方式实现。
一.长度不受限制的字符串函数包括
1.strlen(char )
2.strcpy(char
dest,const char* src)
3.strcat(char* dest,const char* src)
4.strcmp(const char* str1,const char* str2)
二…长度受限制
1.strncpy
2.strncat
3.strncmp
三.常用的内存函数(修改的都是字节)
1.memcpy
2.memmove
3.memcmp
4.memset

首先介绍的是strlen函数,它是用来计算字符串的大小
代码实现有3种方法1.计数器的方法,2.递归,3.指针-指针

#include<stdio.h>
#include<string.h>
int my_strlen1(char* str)
{ int num=0;
 while(*str!='\0')
 { 
    num++;
    str++;
 }
 return num;
}
my_strlen2(char* str)
{  
     if(str!='\0')
    return 1+my_strlen2(str++);
     else
     return 0;
     }

my_strlen3(char* str,int sz)
{
    char* start=str;
    char* end=str;
    while(*end!='\0')
       end++;
    
    return end-start;
}
int main()
{   char arr[]="abcdef";  
  int ret=my_strlen3(arr);
  printf("%s\n",arr);
return 0;
}

接下来实现strcpy函数,作用是复制字符串src到字符串dest中

char* my_strcpy(char* dest,const char* src)
{  assert(dest!=NULL);
   assert(src!=NULL)
  char* ret=dest;  //记住被改变字符串的首地址
while(*dest++=*src++)
{}
return ret;

3.strcat,将src字符串接到dest字符串的后面

my_strcat(char* dest,char* src)
//dest要比src大
{ char* ret=dest;
assert(dest&&src);
while(*dest!='\0')
dest++;
while(*dest++=*src++)
{
   ;
}
return ret;
}

4.strcmp,将字符串1与字符串2比较,字符串1大返正数,2大返负数,相等返回0

int my_strcmp(const char* str1,const char* str2)
{
assert(str1&&str2)
 while(*str1==*str2)
 {  if(*str1=='\0')
    return 0;
     str1++; 
     str2++; 
 }
 return(*str1-*str2);
}

二.长度受限制的字符串函数
1.strncpy,可以复制字符串str至字符串dest并且能指定几个字符

char* my_strncpy(char* dest,const char* src, size_t sum)
{
	char* start = dest;
	int i = 0;
	while (sum && (*dest++ = *src++))
		sum--;
	if (sum)
		while (--sum)
			*dest++ = '\0';
	return start;
} 

2.strncat,可以追加字符串str至字符串dest并且能指定几个字符

char* strncat(char* dest,char* src,size_t  num)
{
char* start=dest;
while(*dest++)
;
dest--;
while(num--)
if(!(*dest++=*src++))
return  (start);
*dest='\0';
return (start);
}

3.strncmp,字符串比较函数

strstr,字符串查找函数,dest是src的子串

char *my_strstr(const char* p1, const char* p2)
{
	assert(p1 != NULL);
	assert(p2 != NULL);
	char* s1 = NULL;
	char* s2 = NULL;
	char* cur = (char*)p1;
	if (*p2 == '\0')
	{
		return p1;
	}
	while (*cur)
	{
		s1 = cur;
		s2 = (char *)p2;
		while ((*s1 != '\0') &&(*s2!='\0')&&*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}

}

三,内存函数
1.memcpy

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);

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

2.memmove,内存移动函数

void* my_memmove(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	if (dest < src)
	{  //前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			++(char*)dest;
			++(char*)src;
		}
	}
	else
	{
	   //后->前 
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

memcmp,内存比较函数
memset,创造内存函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值