【C语言进阶】--- 字符串函数与内存函数

字字符串函数

1.strlen函数

size_t strlen(const char* str);
功能:计算指针str指向的字符串的字符个数
字符串以’\0’作为结束标志,strlen函数返回的是字符串中’\0’前面出现的字符个数(不包括’\0’)
参数指向的字符串必须要以’\0’结束
注意函数的返回值是size_t

模拟实现

size_t m_strlen(const char* str)
{int count = 0;while (*str++){count++;}return count;
}int main()
{char arr[] = "asdfgh";int ret = m_strlen(arr);printf("%d\n", ret);return 0;
}

2.strcpy函数

char* strcpy(char* destination, const char* source);
功能:将指针source指向的字符串的内容拷贝到指针destination指向的字符串里
源字符串必须以’\0’结束
会将源字符串中的’\0’拷贝到目标空间
目标空间必须大,以确保能存放源字符串
目标空间必须是可修改的(比如:char * p = “xxxxxxxxx”;这里的字符串是常量,不能被修改)

模拟实现

char* m_strcpy(char* str1, const char* str2)
{char* tmp = str1;while (*str2){*str1++ = *str2++;}return tmp;
}int main()
{char arr1[10] = "abcde";char arr2[] = "qwer";char* p = m_strcpy(arr1, arr2);printf("%s\n", p);return 0;
}

3.strcat函数

char* strcat(char* destination,const* source);
功能:将指针source指向的字符串的内容拷贝到指针destination指向字符串的第一个出现字符’\0’的位置
源字符必须以’\0’结束
目标空间必须足够大,能容纳下源字符串的内容
目标空间必须可以修改

模拟实现

char* m_strcat(char* str1, const char* str2)
{char* tmp = str1;while (*str1){str1++;}while (*str2){*str1++ = *str2++;}return tmp;
}int main()
{char arr1[10] = "abcde";char arr2[] = "qwer";char* p = m_strcat(arr1, arr2);printf("%s\n", p);return 0;
}

4.strcmp函数

int strcmp(const char* str1, const char* str2);
功能:比较两个字符串的大小
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

模拟实现

nt m_strcmp(const char* str1, const char* str2)
{while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}int main()
{char arr1[] = "abac";char arr2[] = "abad";int ret = m_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}

5.strstr函数

char* strstr(const char* str1, const char* str2);
功能:返回 字符串2第一次出现在字符串1中第一个字符的位置,若找不到,返回null

模拟实现

char* m_strstr(const char* str1, const char* str2)
{char* cp = str1;char* s1 = cp;char* s2 = str2;while (*cp){s1 = cp;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2=='\0')return cp;cp++;}return NULL;
}int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbce";char* p = m_strstr(arr1, arr2);if (p == NULL)printf("没找到");elseprintf("找到了");return 0;
}

6.strtok函数

char* strtok(char* str, const char* delimiters);
功能:在字符串1中寻找字符串2中的字符,若遇到,则替换成空字符并标记这个位置,最终返回字符串1的地址
此时打印该字符串只能打印到空字符的位置
若想打印后面的字符串,需在再次调用该函数,并且传的参数应为NULL和字符串2

应用

#include<string.h>
int main()
{char arr1[] = "192.192.55.0";char copy[30];strcpy(copy, arr1);char arr2[] = ".";char* ret = NULL;for (ret = strtok(copy, arr2); ret != NULL; ret = strtok(NULL, arr2)){printf("%s ", ret);}return 0;
}

7.strerror函数

char* sterror(int errnum);
功能:返回错误码所对应的错误信息(的地址)
库函数在执行中,发生了错位,会将一个错误码存放在errno这个变量中,errno是C语言提供的一个全局变量
比如:0 1 2 3 4 5…这些数在内存中对应不同的错误信息

#include<string.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));}else{printf("成功打开");}//printf("%s\n", strerror(0));//printf("%s\n", strerror(1));//printf("%s\n", strerror(2));return 0;
}

关于内存的函数

1.memcpy函数

void* memcpy(void* destination, const void* scoure, size_t num);
功能:从source的位置开始赋值num个字节的数据到destination的内存位置,返回目的空间的起始位置
处理不相关,不重叠的内存
任何类型都可以实现该功能

模拟实现

void* m_memcpy(void* dest, const void* scr, size_t num)
{void* tmp = dest;while (num--){*(char*)dest = *(char*)scr;dest = (char*)dest + 1;scr = (char*)scr + 1;}return tmp;}
int main()
{int arr1[] = { 1,2,3,4,5,6 };int arr2[] = { 7,8,9,10 };这里不能实现arr1+2向arr1中的内存替换int* p = m_memcpy(arr1, arr2, 8);for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++){printf("%d\n", arr1[i]);}return 0;
}

2.memmove函数

void* memcpy(void* destination, const void* scoure, size_t num);
memcpy函数的升级版,可以实现重叠内存的拷贝

模拟实现

void* m_memmove(void* dest, const void* scr, size_t num)
{void* tmp = dest;if (dest < scr){//前while (num--){*((char*)dest) = *((char*)scr);dest = (char*)dest + 1;scr = (char*)scr + 1;}}if (dest > scr){//后while (num--){*((char*)dest + num) = *((char*)scr + num);}}return tmp;}int main()
{int arr1[] = { 1,2,3,4,5,6 };int* p = m_memmove(arr1+2, arr1, 8);for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++){printf("%d\n", arr1[i]);}return 0;
}

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

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

相关文章

使用 TinyEngine 低代码引擎实现三方物料集成

本文由体验技术团队 TinyEngine 项目成员炽凌创作&#xff0c;欢迎大家实操体验&#xff0c;本体验内容基于 TinyEngine 低代码引擎提供的环境&#xff0c;介绍了如何通过 TinyEngine 低代码引擎实现三方物料集成&#xff0c;帮助开发者快速开发。 知识背景 1.1 TinyEngine 低…

【SkyWalking】使用PostgreSQL做存储K8s部署

拉取镜像 docker pull apache/skywalking-ui:10.0.1 docker tag apache/skywalking-ui:10.0.1 xxx/xxx/skywalking-ui:10.0.1 docker push xxx/xxx/skywalking-ui:10.0.1docker pull apache/skywalking-oap-server:10.0.1 docker tag apache/skywalking-oap-server:10.0.1 xxx…

如何在Python中创建和使用自定义模块

在Python中创建和使用自定义模块非常简单。以下是一个基本的步骤指南&#xff1a; 1. 创建自定义模块 首先&#xff0c;你需要创建一个Python文件来作为你的模块。这个文件可以包含任何有效的Python代码&#xff0c;包括函数、类、变量等。让我们创建一个简单的模块&#xff…

VmWare的网络配置说明

VMware的网络配置提供了多种选项&#xff0c;以支持虚拟机与物理机之间的通信&#xff0c;以及虚拟机之间的通信。这些配置包括桥接模式、网络地址转换模式&#xff08;NAT&#xff09;和仅主机模式&#xff0c;每种模式都有其特定的适用场景。 桥接模式&#xff08;Bridged&a…

SpringBoot集成ireport打印,并解决PDF中文显示问题

1、相关jar包引入 <!-- ireport报表相关 start--><dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId><version>4.5.1</version><exclusions><exclusion><groupId…

Ubuntu 22.04.4 LTS安装cmake-3.29.5

一、下载源码 wget https://github.com/Kitware/CMake/releases/download/v3.29.5/cmake-3.29.5.tar.gz tar -xzvf cmake-3.29.5.tar.gz 二、编译 运行./bootstrap。 如果出现下列问题&#xff1a; -- Could NOT find OpenSSL, try to set the path to OpenSSL root folder …

go语言后端开发学习(二)——基于七牛云实现的资源上传模块

前言 在之前的文章中我介绍过我们基于gin框架怎么实现本地上传图片和文本这类的文件资源(具体文章可以参考gin框架学习笔记(二) ——相关数据与文件的响应)&#xff0c;但是在我们实际上的项目开发中一般却是不会使用本地上传资源的方式来上传的&#xff0c;因为文件的上传与读…

Spring Security系列之Handler

概述 与Spring、Spring MVC、Spring Boot一样&#xff0c;Spring Security里也有很多Handler接口、可以分为两大类&#xff0c;一类是普通的XxxHandler&#xff08;见名知意&#xff09;&#xff0c;另一类是对应的ServerXxxHandler&#xff08;RequestRejectedHandler除外&am…

gitlab远端指定分支回退到之前的版本

要在GitLab远端指定分支回退到之前的版本&#xff0c;你可以先在本地回退&#xff0c;然后强制推送到远端。以下是步骤和示例代码&#xff1a; 1.检出到你想要回退的分支&#xff1a; git checkout your-branch-name2.使用git log查找你想要回退到的提交的commit ID&#xff…

短剧看剧系统投流版系统搭建,前端uni-app

目录 前言&#xff1a; 一、短剧看剧系统常规款短剧系统和投流版的区别&#xff1f; 二、后端体系 1.管理端&#xff1a; 2.代理投流端 三、功能区别 总结&#xff1a; 前言&#xff1a; 23年上半年共上新微短剧481部&#xff0c;相较于2022年全年上新的454部&#xff0…

读AI未来进行式笔记06自动驾驶技术

1. 跃层冲击 1.1. 每个社会其实都处于不同的楼层&#xff0c;往往处于更低楼层的社会&#xff0c;要承受来自更高楼层的社会发展带来的更大冲击 2. 驾驶 2.1. 开车时最关键的不是车&#xff0c;而是路 2.2. 人是比机器更脆弱的生命&am…

JavaEE初阶---多线程编程(一.线程与进程)

目录 &#x1f923;一.线程与进程的概念与联系&#xff1a; 进程的基本概念&#xff1a; 线程的基本概念&#xff1a; 进程和线程的区别与联系&#xff1a; &#x1f643;代码执行实列&#xff1a; 1.通过继承Thread父类来实现多线程 2.通过实现Runnable接口来实现多线程…

java调用GDAL及JTS实现生成泰森多边形(Voronoi图)的一种方法

目录 一、关于泰森多边形 1.泰森多边形的特性 2.本文的目的 二、实现思路 1.gdal和jts库的maven坐标 2.jts生成泰森多边形的关键代码 3.使用GDAL读取源文件信息的关键代码 4.使用GDAL将生成的泰森多边形写入文件 三、实现结果 1.实现的效果 2.完整代码示例 一、关于…

Android adb pull base.apk 方法介绍

在Ubuntu系统下执行命令&#xff1a; hulkhulk-ThinkCentre-M710t-N000:~/Downloads$ adb shell pm path com.demo.app package:/data/app/~~KNtpvkoBN4xXNFZLmIkh6g/com.demo.app-Qkx3kRXzzMkQeWal64Z1Pg/base.apk hulkhulk-ThinkCentre-M710t-N000:~/Downloads$ adb pull /d…

【稳定检索/投稿优惠】2024年智慧金融与财务管理国际会议(SFFM 2024)

2024 International Conference on Smart Finance and Financial Management 2024年智慧金融与财务管理国际会议 【会议信息】 会议简称&#xff1a;SFFM 2024 截稿时间&#xff1a;以官网为准 大会地点&#xff1a;中国广州 会议官网&#xff1a;www.iacsffm.com 会议邮箱&am…

【漏洞复现】海康威视综合安防管理平台 多处 FastJson反序列化RCE漏洞

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 由于…

【安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务】

安装笔记-系列文章目录 安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务 文章目录 安装笔记-系列文章目录安装笔记-20240607-Linux-适合个人用户及初创企业的 SSL 证书服务 前言一、软件介绍名称&#xff1a;acme.sh主页官方介绍 二、安装步骤测试版本&#x…

React@16.x(21)渲染流程-更新

目录 1&#xff0c;更新的2种场景2&#xff0c;节点更新3&#xff0c;对比 diff 更新3.1&#xff0c;React 的假设3.1.2&#xff0c;key 2.1&#xff0c;找到了对比的目标2.1.1&#xff0c;节点类型一致1&#xff0c;空节点2&#xff0c;DOM节点3&#xff0c;文本节点4&#xf…

Flutter与iOS原生混合开发 iOS项目集成Flutter

1.创建flutter module 进入iOS工程根目录的上一级&#xff0c;创建flutter module工程 flutter create --template module fluttermodule2.进入iOS工程根目录&#xff0c;编辑podfile文件 flutter_application_path ../fluttermodule load File.join(flutter_application_pa…

Nginx 配置防护 缓慢的 HTTP拒绝服务攻击+点击劫持:X-Frame-Options未配置

一 安全团队检测网站 1 检测到目标主机可能存在缓慢的HTTP拒绝服务攻击 缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击&#xff0c;攻击者操纵网络,对目标Web服务器进行海量HTTP请求攻击&#xff0c;直到服务器带宽被打满&#xff0c;造成了拒绝服务。 慢…