IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 鹏C语言字符串函数的使用与剖析笔记 -> 正文阅读

[C++知识库]鹏C语言字符串函数的使用与剖析笔记

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()

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 01:47:57  更:2022-09-15 01:49:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:17:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码