C/C++库函数之——str类和mem篇(常用速学)

news2024/11/29 8:38:34

目录

一,str类

1)strlen

2)strcpy

3)strcmp

4)strcat

5)strstr

二,mem类函数

1)memcpy

2)memmove


一,str类

1)strlen

用途:求字符长度,返回值为size_t,无符号整型

用法:可以用一个整形接受返回值,或者直接使用。例如:int  ret  =  strlen(s);

原理:使用时是以' \0‘作为结束计数的,如果字符数组没有'  \0  ',可能会非法访问,长度计算也不准确。

自编源码:

int my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
  count++;
  str++;
 }
 return count;
}

2)strcpy

用途:用来将一串字符中的内容复制到另一串字符

用法:返回值是被复制目的地原来的首元素地址,有两个参数,第一个是目的地字符串地址,第二个是源头字符串地址。例如:strcpy(s1,s2);

原理:仍然是以'  \0  '为复制结束标准,并且注意,尽量不要以自身范围的地址同时作为源头,目的地。

自编源码:

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

3)strcmp

用途:用来比较字符串大小

用法:两个参数,当第一个参数大于第一个参数,返回大于0的值,相当则返回0,小于返回小于0的值。

原理:从给定的地址,开始比较,找到第一个不同的字符比较,直到'  \0  ’;

自编源码:

int my_strcmp (const char * src, const char * dst)
{
  int ret = 0 ;
 assert(src != NULL);
  assert(dest != NULL);
  while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
    ++src, ++dst;
​
  if ( ret < 0 )
    ret = -1 ;
  else if ( ret > 0 )
    ret = 1 ;
​
  return( ret );
}

4)strcat

用途:连接字符串

用法:两个参数,第一个为连接目的地地址,连接源头字符串,返回被连接目的地原来的首元素地址

原理:从目的地‘  \0  ’,开始添加,最后将' \0 '加入末尾。

自编源码:

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

5)strstr

用途:寻找子字符串

 用法:两个参数,第一个被寻找的母串,第二个是子串,如果寻找到返回寻找到的母串中子串的地址,没找到则返回NULL。

自编源码:

char *  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 ( *s1 && *s2 && !(*s1-*s2) )
                        s1++, s2++;


                if (!*s2)
                        return(cp);


                cp++;
        }


        return(NULL);
}
 

二,mem类函数

1)memcpy

用途:类似strcpy,但是可以复制所有类型的数组

用法:有三个参数,一个是目的地字符串地址,第二个是源头字符串地址,第三个是复制字节大小,返回值仍然是第一个字符串地址

原理:强转为char*,这样就可以以字节为单位复制,之所以以字节为单位,原因很简单,可以自己思考。

自编源码:

void* My_memcpy(void* dest, void* src, int sz) {
	void* temp = dest;
	while (sz--) {
		*((char*)dest)++ = *((char*)src)++;
	}
	return temp;
}

2)memmove

用途:可以将一个数组中的内容移动到另一个数组,不改变原来数组。

用法:三个参数,第一个是一个是目的地字符串地址,第二个是源头字符串地址,第三个是复制字节大小,返回值仍然是第一个字符串地址

自编源码:(其中有很多玄妙,下面解说)

void* My_memmove(void* dest, void* src, int sz) {
	void* temp = dest;
	if (dest > src) {
		while (sz) {
			
			*((char*)dest+sz-1) = *((char*)src+sz-1);
			sz--;
		}
	}
	else {
		int i = 0;
		while (i < sz) {
			*((char*)dest+i) = *((char*)src+i);
			i++;
		}
	}
	return dest;
}

如果移动的是通一个数组,那么可能会一边改变数组,一边复制,可能会出错,因此我们要分类,如果目的地地址在源头地址之后的话,我们就要从后往前拷贝

 反之则从前往后拷贝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光伏5G多合一融合终端|光伏多合一融合终端|光伏多合一群调群控网关|分布式光伏群控群调|光伏AGC/AVC系统这几者之间什么技术关系,多少钱一套预算?

光伏5G多合一融合终端|光伏多合一融合终端|光伏多合一群调群控网关|分布式光伏群控群调|光伏AGC/AVC系统这几者之间什么技术关系&#xff0c;多少钱一套预算&#xff1f; 一&#xff1a;光伏5G多合一融合终端的功能 光伏5G多合一融合终端的功能&#xff1a;群调群控/AGC/AVC功…

[MMDetection]生成测试集预测的test.bbox.json文件

基于MMdetection3.10 困扰了大半天的问题&#xff0c;终于解决了。 方法1&#xff1a;定位到configs\_base_\datasets\coco_detection.py 将里面的路径全部换为自己的路径&#xff0c;最重要的是将以下注释取消掉&#xff0c;特别注意以下两个参数 改好的文件示例 # datase…

数据结构 - 线性表(C语言版)

线性表分为顺序表和单链表 线性表的操作主要是查询、插入、删除 1、顺序表 首先&#xff0c;定义一个顺序表的结构体 #define MAX_SIZE 10 typedef struct {int data[MAX_SIZE];int length; }SqList, * PsqList;创建一个线性表 void createSqList(PsqList pSqList) {pSqLis…

Spring—事务及事务的传播机制

Spring—事务及事务的传播机制 &#x1f50e;事务的定义&#x1f50e;Spring—事务的实现铺垫Spring 编程式事务Spring 声明式事务Transactional 的参数注意事项Transactional 的工作原理 &#x1f50e;Spring—事务的隔离级别MySQL—事务的隔离级别Spring—事务的隔离级别Spri…

剑指 Offer 04. 二维数组中的查找(java)

二维数组中的查找 剑指 Offer 04. 二维数组中的查找题目描述抽象 BST 解题 二叉树专题 剑指 Offer 04. 二维数组中的查找 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof 题目描述…

js为啥是设计成单线程而不是多线程呢

了解这个问题之前&#xff0c;需要先了解一下以下问题&#xff1a; 什么是进程&#xff1f;什么是线程&#xff1f;二者有啥关联&#xff1f;任务队列是什么&#xff1f;宏任务&#xff1f;微任务&#xff1f;eventloop&#xff1f;为什么说js是单线程&#xff0c;为什么要设计…

UWB高精度定位标签方案,厘米级室内测距,实时人员物品位置确定

随着科技的不断进步&#xff0c;UWB技术正逐渐成为各个领域的定位解决方案的首选。其高精度、安全、实时的特性使其在安全免提访问控制、实时室内定位等应用领域发挥着重要的作用。 安全免提访问控制是目前应用UWB技术的重要领域之一。通过将UWB标签&#xff08;如手机、钥匙扣…

Django如何删除数据库表中的数据【不断积累】

这篇博客积累Django的数据库常用删除方法。 假设有表模型Author定义如下&#xff1a; class Author(models.Model):name models.CharField(max_length100)def __str__(self):return self.name01-根据记录的id号来删除指定的记录 Django 默认为每个模型添加一个名为 id 的自…

RPA赋能日化产业,实在智能广东日化共推行业数字化转型

广东日化&#xff0c;因其独特的地域、产能优势&#xff0c;成为广东制造业的支柱产业之一&#xff0c;占据了全国日化行业的半壁江山。作为本土最具影响力商会组织之一&#xff0c;广东省日化商会凝聚了一批具有影响力的日化企业&#xff0c;其经济总量、市场占有率、品牌知名…

python网站创建:初识网站(001)

1. 初识网站&#xff1a;首先来认识一下&#xff0c;前端、后端、数据库它是怎么分工合作来形成网站的 使用python创建网站之前&#xff0c;需要先稍微认识一下两个最流行python web框架&#xff1a;(Flask)和(Django) Flask是一个轻量级的框架&#xff0c;适用于比较轻巧&…

【*1900倍数遍历】CF1627 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 在枚举数列子集的gcd时&#xff0c;通常可以枚举倍数 对于这道题要注意&#xff0c;j/i的gcd要为1&#xff0c;这样才能保证i是这个子集的最大公约数 Code&#xff1a; #include <bits/stdc.h>//#define…

三菱FX3U简单工程编程

1.简单工程编程 1.1.元件 常开触点&#xff08;ld&#xff09; 选中位置&#xff0c;点击图标&#xff0c;输入软元件&#xff0c;完成添加。 选中位置&#xff0c;快捷键F5添加。 选中位置&#xff0c;输入ld 软元件添加。常闭触点&#xff08;ldi&#xff09;横线、竖线 …

红黑树增删操作详解(相信我,这次你一定会弄懂)

前言&#xff1a; 网上众多关于红黑树的讲解&#xff0c;但大多数都是重复的&#xff0c;只列出了几种简单情况&#xff0c;逻辑和思维深度都不足以解答吾之困惑。。。 直到看到张彦峰先生的 对红黑树的认识总结&#xff0c;基本可以说是集大成者&#xff0c;本文会基于…

MySQL原理探索——28 读写分离有哪些坑

在上一篇文章中&#xff0c;介绍了一主多从的结构以及切换流程。今天我们就继续聊聊一主多从架构的应用场景&#xff1a;读写分离&#xff0c;以及怎么处理主备延迟导致的读写分离问题。 我们在上一篇文章中提到的一主多从的结构&#xff0c;其实就是读写分离的基本结构了。这里…

linux环境下使用jmeter进行分布式测试

目录 1、前言 2、环境准备 3、分布式配置 总结&#xff1a; 1、前言 熟练使用jmeter进行性能测试的工程师都知道&#xff0c;jmeter的客户端性能是有点差的。这会导致一个问题&#xff0c;其客户端的性能损耗会干扰到性能测试的结果&#xff0c;而且当线程数/并发大到一定程…

我爱学QT-仿写智能家居界面 上 中 下

学习链接&#xff1a; 仿写一个智能家居界面&#xff08;上&#xff09;_哔哩哔哩_bilibili 上 给QT工程添加资源文件 在这里 然后选这个&#xff0c;choose后会有起名&#xff0c;之一千万不能是中文&#xff0c;要不就等报错吧 然后把你要添加的图片托到文件夹下&#xf…

FPGA好找工作吗?薪资待遇怎么样?

FPGA&#xff1a;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的&#xff0c;既解决了定制电路的不足&#xff0c;又克服了原有可编程器件门电路数有限的缺点。 FPGA太…

Codeforces round 883 div3

A. Rudolph and Cut the RopeA. Rudolph and Cut the Rope 题目大意 有 n 个钉子钉在墙上&#xff0c;第 i 个钉子被钉在离地面 ai 米高的位置&#xff0c;一根长度为 bi 米的绳子的一端被绑在它上面。所有钉子都悬挂在不同的高度上。糖果同时被绑在所有绳子的末端&#xff0…

浅谈关于智慧校园安全用电监测系统的设计

0引言 人生人身安全是大家关注的话题&#xff0c;2019年12月中国消防统计近五年发生在全国学生宿舍的火灾2314起&#xff08;中国消防2019.12.应急管理部消防救援局官方微博&#xff09;&#xff0c;违规电器是引发火灾的主因。如果在各寝室安装智能用电监测器实时监督线路参数…

【力扣算法05】之 _1911_ 最大子序列交替和- python

文章目录 问题描述示例 1示例2示例3提示 思路分析代码分析完整代码运行示例代码示例1示例2示例3 完结 问题描述 一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说&#xff0c;数组 [4,2,5,3] 的交替和为 (4 5) - (2 3) 4…