学习c语言第18天(字符串和内存函数)
1.函数介绍
1.1 strlen
size_t(就是无符号整形) strlen(const char * str);
字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包
含'\0')
参数指向的字符串必须要以\0结束。
注意函数的返回值为size_t,是无符号的(易错 ) 不能相减
strlen函数模拟
int my_strlen(char* arr)
{assert(arr);int counst = 0;while (*arr != '\0'){counst++;arr++;}return counst;
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len);return;
}
1.2 strcpy
char * strcpy (char * destination,const char * source)
Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
源字符串必须以'\0'结束。
会将源字符串中的'0'拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
//strcpy函数模拟
void my_strcpy(char*arr2, const char* arr1)
{assert(arr1);assert(arr2);while (*arr1 != '\0'){*arr2++ =*arr1++;}*arr2 = *arr1;//复制\0;
}
int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s",arr2);return 0;
}
1.3 strcat
字符串追加

char * strcat (char * destination,const char * source)
Appends a copy of the source string to the destination string. The terminating null characterin destination is overwritten by the first character of source, and a null-character is includedat the end of the new string formed by the concatenation of both in destination.
源字符串必须以'\0'结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
字符串自己给自己追加,如何? 不能
//模拟strcat
char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest != '\0'){dest++;}while (*dest++=*src++){;}return ret;
}
int main()
{char arr1[20] = "hello ";my_strcat(arr1,"world");printf("%s\n",arr1);return 0;
}
1.4 strcmp
比内容不是比长度
int strcmp(const char*str1,const char*str2);


//模拟strcmp
int my_strcmp(const char*str1,const char*str2)
{assert(*str1&&*str2);while (*str1==*str2){if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;//也可以写成return(*str1-*str2);
}
int main()
{char arr1[20] = "zhangsan";char arr2[] = "zhangsanfeng";int ret = my_strcmp(arr1,arr2);if (ret < 0)printf("<\n");else if (ret == 0)printf("==\n");elseprintf(">n");return 0;
}
增加长度限制
strncmp 加了一个参数n
strncat
strncpy
1.5 strstr
查找子串的一个函数
const char *strstr (const char *str1,const char *str2);char *strstr ( char *str1,const char *str2 )
找到了返回子串的地址找不到返回空指针

模拟strstr
char * my_strstr(char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = str1;const char* s2 = str2;const char* p = str1;while (*p){s1 = p;s2 = str2;while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)p;}p++;}return NULL;
}
int main()
{char email[] = "zpw@bitejiuyeke.com";char substr[] = "bitejiuyeke";char* ret = my_strstr(email, substr);if (ret == NULL){printf("字串不存在\n");}else{printf("%s",ret);}return 0;
}
KMP算法比较高效
1.6 strtok
用来切割字符串
char *strtok(char*str,const char *sep)
sep参数是个字符串!定义了用作分隔符的字符集合
第一个参数指定一个字符串,
它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。
(注strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为 NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,,则返回 NULL指针。


1.7 strerror
返回错误码所对应的信息
char * strerror

字符分类函数

字符转换函数

1.8 memcpy
内存拷贝函数,负责两块独立空间中的数据
void*memcpy(void * destination,const void * source ,size_t num);

//模拟memcpy
void* my_memcpy(void *dest,const void *src,size_t num)
{assert(dest && src);void* ret = dest;while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}
int main()
{int arr1[] = {1,2,3,4,5,6,7};int arr2[10] = {0};my_memcpy(arr2,arr1,28);return 0;
}
1.9 memmove
void*memmove(void * destination,const void * source ,size_t num);
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
如果源空间和目标空间出现重叠,就得使用memmove函数处理。

//模拟memmove
void* my_memmove(void *dest,const void *src,size_t num)
{void* ret = dest;if (dest <src){//从前向后while (num--){*(char*)dest = *(char* )src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{//从后向前while (num--){*((char*)dest + num) = *((char*)src + num);}}//有时候需要从前往后,有时候从后往前处理数据 return ret;
}
int main()
{int arr1[] = {1,2,3,4,5,6,7,8,9,10};my_memmove(arr1+2,arr1,20);int i = 0;for (i = 0; i < 10; i++){printf("%d",arr1[i]);}return 0;
}
1.10 memcmp
int memcmp(const void * ptr1,const void * ptr2,size_t num);

1.11 memset
void * memset(void *ptr,int value,size_t num);
以字节为单位修改,不能初始化数组;

相关文章:
学习c语言第18天(字符串和内存函数)
1.函数介绍 1.1 strlen size_t(就是无符号整形) strlen(const char * str); 字符串已经\0作为结束标志,strlen函数返回的是在字符串中\0前面出现的字符个数(不包 含\0) 参数指向的字符串必须要以\0结束。 注意函数的返回值为size_t,…...
无心剑七绝《潘展乐神》
七绝潘展乐神 潘江陆海忘情游 展志凌云筑玉楼 乐创全球新纪录 神姿英发舞金钩 2024年8月1日 平水韵十一尤平韵 潘展乐神,这四个字,如同四座矗立的丰碑,分别代表了潘展乐在游泳领域的卓越成就、豪情壮志、快乐创新和非凡风采。无心剑的这首…...
Linux C++ 开发1 - 搭建C++开发环境
1. 安装GCC/GDB 1.1. 安装1.2. 校验 2. 安装CMake 2.1. 安装2.2. 校验 3. 安装IDE 3.1. VSCode3.2. CLion 1. 安装GCC/GDB 1.1. 安装 # 更新软件源 sudo apt update # 通过以下命令安装编译器和调试器 sudo apt install build-essential gdb Ubuntu 默认情况下没有提供C/C…...
吴恩达老师机器学习-ex4
梯度检测没有实现。有借鉴网上的部分 导入相关库,读取数据 因为这次的数据是mat文件,需要使用scipy库中的loadmat进行读取数据。 通过对数据类型的分析,发现是字典类型,查看该字典的键,可以发现又X,y等关…...
C语言-函数例题
函数经典例题 1、编写一个函数实现该功能:从键盘输入一个字串符, 再输入两个正整数 m 和 n, 输出字符串中从 m 开始, 连续 n 个字符。例如, 输入 abcdefg,2,3,输出 bcd. #include <stdio.h> /*作者: zcy日期:功能描述:编写…...
鸿蒙应用框架开发【多HAP】程序框架
多HAP 介绍 本示例展示多HAP开发,简单介绍了多HAP的使用场景,应用包含了一个entry HAP和两个feature HAP,两个feature HAP分别提供了音频和视频播放组件,entry中使用了音频和视频播放组件。 三个模块需要安装三个hap包ÿ…...
PG如何实现跨大版本升级
数据库进行升级,是一个再正常不过的功能,比如功能的需要,遇到BUG,安全漏洞等等,具体升级包含子版本升级,主版本升级。如果用过ORACLE的朋友,一定知道,在ORACLE中,如果要实…...
JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南
JDK 8 升级 17 简介 从 JDK 8 升级到 JDK 17 的过程中,有几个主要的变化,特别是 Java Platform Module System (JPMS) 的引入,以及一些包路径的调整。以下是与 JDK 17 相关的一些重要变化: Java Platform Module System (JPMS) …...
基于java的人居环境整治管理系统(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝20W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
深入了解Pip:Python包管理器的详细指南
目录 Pip简介Pip的安装与升级Pip的基本使用 安装包卸载包列出已安装的包查看包的信息 管理依赖 使用requirements.txt冻结当前环境的包 Pip进阶用法 安装特定版本的包使用代理安装包从本地文件安装包 创建和发布Python包 创建一个Python包编写setup.py文件发布到PyPI 常见问题…...
Corsearch 用 ClickHouse 替换 MySQL 进行内容和品牌保护
本文字数:3357;估计阅读时间:9 分钟 作者:ClickHouse Team 本文在公众号【ClickHouseInc】首发 Chase Richards 自 2011 年在初创公司 Marketly 担任工程负责人,直到 2020 年公司被收购。他现在是品牌保护公司 Corsear…...
常见的应急救援设备有哪些_鼎跃安全
在我们的生活中,应急事件的发生常常是突如其来的,它们对人民的生命财产安全构成重大威胁,同时也对社会稳定提出严峻挑战。在这样的紧急情况下,迅速开展有效的救援工作显得尤为重要。而在整个救援过程中,应急设备的使用…...
Vue 项目部署后首页白屏问题排查与解决
引言 在部署 Vue.js 项目时,有时会遇到首页加载后出现白屏的情况,这可能是由于多种原因造成的。本文将介绍一些常见的排查方法和解决方案,帮助开发者快速定位问题并解决。 1. 常见原因分析 首页白屏的问题可能由以下几个方面的原因导致&am…...
STM32 定时器移相任意角度和占空比,频率可调
由于使用了中断修改翻转的CCR值,对于频率超250K以上不太适用. void Motor1_Init(Motor MotorChValue) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;NVIC_InitTypeDef NVIC_Ini…...
C++ 与其他编程语言区别_C++11/14/17新特性总结
C11 decltype类型推导 decltype不依赖于初始化,根据表达式类推导类型 auto b :根据右边a的初始值来推导出变量的类型,然后将该初始值赋给bdecltype 则是根据a表达式来推导类型,变量的初始值与表达式的值无关表达式类型注意点&…...
玩转云服务:Google Cloud谷歌云永久免费云服务器「白嫖」 指南
前几天,和大家分享了: 玩转云服务:Oracle Cloud甲骨文永久免费云服务器注册及配置指南 相信很多同学都卡在了这一步: 可用性域 AD-1 中配置 VM.Standard.E2.1.Micro 的容量不足。请在其他可用性域中创建实例,或稍后…...
用18讲必看:宇哥亲划重点内容+核心题总结
25考研结束之后,张宇老师的风评可能会两极分化 其中一波把张宇老师奉为考研数学之神,吹捧「三向解题法」天下无敌。 另外一波对张宇老师的评价负面,在网上黑张宇老师! 为什么会这么说,因为张宇老师的新版36讲争议太…...
什么是安全生产痕迹化管理?如何做到生产过程中全程痕迹化管理?
安全生产痕迹化管理,简单来说,就是通过记录一些“信息”来确保安全工作的进展。这些方法包括记会议内容、写安全日记、拍照片、签字盖章、指纹识别、面部识别还有手机定位等。记录下来的文字、图片、数据和视频,就像一个个“脚印”࿰…...
VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器
一、引言 如上图,我有一个解决方案【EtchDevice】,他包含两个(甚至更多个)子项目,分别是【DeviceRT】和【DeviceWin】,见名知意,我需要一个项目编译运行在RTOS上,譬如一个名叫INTime…...
Flat Ads资讯:Meta、Google、TikTok 7月产品政策速递
Flat Ads拥有全球媒介采买(MediaBuy)业务,为方便广告主及时了解大媒体最新政策,Flat Ads将整理大媒体产品更新月报,欢迎大家关注我们及时了解最新行业动向。 一、Meta 1、Reels 应用推广现可突出显示应用评分、点评和下载量 为了不断优化 Instagram 上的广告体验和广告表现,…...
科研人狂喜!AI生成的位图可以转矢量图了
今天给大家分享我最近挖到的宝藏科研工具:MedPeer「图片创作」——国内领先的垂直领域AI科研绘图工具,刚好解决我们科研人最头疼的几个痛点。尤其是它的人工绘图转换服务,简直是帮我解决了大麻烦,必须给大家捋捋明白。我们科研人绘…...
HFSS与CST互导实战:5分钟搞定模型转换与数据对比(以微带天线为例)
HFSS与CST互导实战:微带天线模型转换与数据对比指南 在射频工程领域,HFSS和CST作为两大主流电磁仿真工具各有优势。实际项目中经常需要在这两个平台间迁移模型并对比结果,以确保仿真可靠性。本文将手把手演示如何高效完成模型互导与数据验证。…...
AC鸭的训练分组
题目描述 AC鸭准备参加一次训练营,一共有 n 个训练项目,第 i 个项目需要花费 ai 分钟。 训练老师要求 AC鸭按顺序完成所有项目,并且可以把这些项目分成不超过 m 组。每一组必须是连续的一段项目,同一组项目在同一天完成。 AC…...
Gridfinity Rebuilt OpenSCAD优化技巧:节省材料、提升打印质量的7个方法
Gridfinity Rebuilt OpenSCAD优化技巧:节省材料、提升打印质量的7个方法 【免费下载链接】gridfinity-rebuilt-openscad A ground-up rebuild of the stock gridfinity bins in OpenSCAD 项目地址: https://gitcode.com/gh_mirrors/gr/gridfinity-rebuilt-opensca…...
ReAct不是格式游戏!揭秘让LLM从“文本生成器”变身“决策引擎”的底层逻辑
文章指出,ReAct常被误解为高级Prompt工程,但核心是闭环执行架构。真正的ReAct强调“决策-执行-反馈”循环,而非固定的Thought/Action/Observation格式。工程代码定义流程,模型生成内容,实现真实工具调用与反馈闭环。文…...
如何准确计算宏基因组覆盖率?CoverM工具的全方位技术解析
如何准确计算宏基因组覆盖率?CoverM工具的全方位技术解析 【免费下载链接】CoverM Read alignment statistics for metagenomics 项目地址: https://gitcode.com/gh_mirrors/co/CoverM 在宏基因组研究中,覆盖率计算是评估测序深度、估算物种丰度和…...
LeagueAkari:3分钟快速上手的英雄联盟终极本地自动化工具指南
LeagueAkari:3分钟快速上手的英雄联盟终极本地自动化工具指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾经在英雄联盟…...
腾讯云主机部署Kali Linux:从零自制镜像到一键重装实战
1. 为什么要在腾讯云上部署Kali Linux? Kali Linux作为安全测试领域的瑞士军刀,集成了600渗透测试工具,从Wireshark到Metasploit应有尽有。但直接在物理机安装会面临驱动兼容性、系统稳定性等问题,而云主机部署既能保留完整功能&…...
FPGA与ASIC核心技术对比与选型指南
1. FPGA与ASIC的本质差异解析在数字电路设计领域,FPGA(现场可编程门阵列)和ASIC(专用集成电路)代表着两种截然不同的技术路线。FPGA本质上是一种"硬件可重构"的半导体器件,其核心结构由可编程逻辑…...
手把手教你用Arduino/树莓派DIY一个OBD-II数据记录器(附K线电平转换电路详解)
从零构建车载OBD-II数据记录器:硬件选型与K线通信实战指南 在汽车电子爱好者和嵌入式开发者的圈子里,OBD-II接口一直是个充满魔力的数据宝库。想象一下,通过几十元的开发板和简单的电路改造,就能实时获取发动机转速、水温、节气门…...
