鹏C语言字符串函数的使用与剖析笔记

本文详细介绍了C语言中的字符串处理函数,包括strcpy用于字符串复制、strlen计算字符串长度、strcat追加字符串、strcmp字符串比较、strstr查找子串,以及字符转换函数如tolower和toupper。通过模拟实现和库中版本对比,帮助理解其实现原理。
摘要由CSDN通过智能技术生成

1.strcpy函数

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

引头文件<string.h>

功能:把 src 所指向的字符串复制到 dest

模拟实现:

#include<assert.h>
char* my_strcpy(char* dest, const char* ret)//strcpy函数的实现
{
	assert(dest);
	assert(ret);
	char*cmp = dest;
	while (*dest++=*ret++)
	{
		;
		
	}
	return cmp;
}

库中实现:

char * strcpy(char * dst, const char * src)
{
        char * cp = dst;
 
        while( *cp++ = *src++ )
                ;               /* Copy src over dst */
 
        return( dst );

}

2.strlen函数

size_t strlen(const char *str) 

引头文件<string.h>

功能:计算字符串的长度,不包含'\0'

模拟实现:

int my_strlen(const char*str)//strlen函数的实现(计数)
{
	int ret = 0;
	while (*str)
	{
		str++;
		ret++;
	}
	return ret;
}




int  my_strlen(const char* str) //(递归)
{
    if (*str != '\0') 
    {
        return 1 + my_strlen(str + 1);//不到'\0'就地址加一,数量加一
    } 
    else 
    {
        return 0;
    }
}



void my_strlen(const char* str)//(指针相减) 
{
    const char* start = str; //起始位置的地址
    const char* end = str;
 
    while (*end != '\0')
    {  
        end++;//得到最后一个元素的地址
    }
 
    return end - start;//两个指针相减得到中间元素个数以实现strlen函数
}

3.strcat函数

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

功能:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

模拟实现:

char* my_strcat(char* dest, const char* src)//strcat函数的实现(追加函数)
{
	char* tmp = dest;
	while (*dest != '\0')//找到dest\0的前一个元素的地址
	{
		dest++;
	}
	while (*dest++ = *src++)//从\0开始将scr追加到dest后,scr自带'\0',
                           //所以可以将dest的'\0'用scr的首元素代换
	{
		;
	}
	return tmp;
}

库中实现:

char* strcat ( char * dst , const char * src )
{
 
    char * cp = dst;
 
    while( *cp )
 
    cp++;     /* find end of dst */
 
    while( *cp++ = *src++ ) ;     /* Copy src to end of dst */
 
    return( dst );     /* return dst */
 
}

//以上为长度不受限制的字符串函数

长度受限制的字符串函数:strncpy   strncat   strncmp   这些函数要一个形参n来限制长度(直到 n 字符长度为止)

4.strcmp函数

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

功能:str1 所指向的字符串和 str2 所指向的字符串进行比较。

模拟实现:

int my_strcmp(char* str1, char* str2)//strcmp函数的实现
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return (*str1 - *str2);//大于返回正数,小于返回负数
}


/*如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。*/

库中实现:

int __cdecl strcmp (const char * src, const char * dst)
{
    int ret = 0 ;
    while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                ++src, ++dst;  
    if ( ret < 0 )
           ret = -1 ;
    else if ( ret > 0 )
           ret = 1 ;
    return( ret );
}

5.strstr函数

char *strstr(const char *e1, const char *e2) 

功能:在字符串 e1中查找第一次出现字符串 e2 的位置,不包含终止符 '\0'。(查找子串)

模拟实现:

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

	}
	return NULL;//没找到
}

个人解读上述实现逻辑:

为何要创建变量cur?找一个能存放p1找到的子串中首元素地址的临时变量,以便找到后能return回去

为何要创建s1与s2?

创建s1的目的是有一个当cur指向子串首元素地址时,继续向后++查找是否相同,如果++后的元素不相同了,则s1可以在cur++后重置继续向下查找(可以理解为受cur操控的工具人);   

创建s2的目的是解决如果直接使用p2进行++,则如果查找不全但又被++时,不好重置的问题,每次循环上来未查找完全时,就可以实现从头查找的目的

库中实现:

char * __cdecl strstr(const char *str1, const char *str2)
{
    char *cp = (char *)str1;
    char *s1, *s2;
​
    if (!*str2)
        return((char *)str1);
​
    while (*cp)
    {
        s1 = cp;
        s2 = (char *)str2;
​
        while (*s2 && !(*s1 - *s2))
            s1++, s2++;
​
        if (!*s2)
            return(cp);
​
        cp++;
    }
​
    return(NULL);
}

字符分类函数

 

字符转换函数:大写转小写tolower()       小写转大写toupper()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值