字符函数和字符串函数【上篇】
文章目录
- 🎖️1.函数介绍
- 📬1.1. strlen
- 📬1.2. strcpy
- 📬1.3. strcat
- 📬1.4. strcmp
- 📬1.5. strncpy
- 📬1.6. strncat
- 📬1.7. strncmp
🎖️1.函数介绍
📬1.1. strlen
🚩(1)字符串已 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ’\0’ 前面出现的字符个数(不包含 ‘\0’)
🚩(2) 参数指向的字符串必须要以 ‘\0’ 结束
🚩(3) 注意函数的返回值为 size_t ,是无符号的
🚩(4) 学会strlen函数的模拟实现
可以参考一下 cplusplus 中的资料👇
🔴(1)请看示例代码👇
#include<stdio.h>
#include<string.h>int main()
{int len1 = strlen("abcdef");printf("%d\n", len1);char arr[] = "abc\0def";int len2 = strlen(arr);printf("%d\n", len2);return 0;
}

🔴(2)请看示例代码👇
int main()
{char arr[3] = { 'a','b','c' };int len = strlen(arr);printf("%d\n", len);return 0;
}

🚨因为它会一直向后找,直到找到 ’\0’ 才停止,所以输出的是个随机值
🔴(3)请看示例代码输出的是什么呢👇
int main()
{if (strlen("abc") - strlen("abcdef") > 0){printf(">\n");}else{printf("<\n");} return 0;
}

🚨一定要记住strlen函数的返回值为 size_t — 是无符号整型的
🔴(4)模拟实现strlen函数👇
1️⃣ 计数器👇
//计数器
#include<assert.h>int my_strlen(const char* str)
{int count = 0;assert(str);while (*str != '\0'){count++;str++;}return count;
}int main()
{char arr[] = "hello";int len = my_strlen(arr);printf("%d\n", len);return 0;
}
2️⃣递归实现👇
//递归
//不能创建临时变量,求字符串长度
int my_strlen(const char* str)
{if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;
}int main()
{char arr[] = "hello";int len = my_strlen(arr);printf("%d\n", len);return 0;
}
3️⃣指针 - 指针👇
//指针 - 指针
#include<assert.h>int my_strlen(const char* str)
{char* start = str;assert(str && start);while (*str){str++;}return str - start;
}int main()
{char arr[] = "hello";int len = my_strlen(arr);printf("%d\n", len);return 0;
}

📬1.2. strcpy
🚩(1) 源字符串必须以 ‘\0’ 结束
🚩(2) 会将源字符串中的 ‘\0’ 拷贝到目标空间
🚩(3) 目标空间必须足够大,以确保能存放源字符串
🚩(4) 目标空间必须可变
🚩(5) 学会模拟实现 strcpy函数
可以参考一下 cplusplus 中的资料👇
🚩char * strcpy ( char * destination, const char * source );
🔴(1)请看示例代码👇
#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}

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

🔴(3)目标空间必须足够大👇
//这是一个错误示范 - 目标空间必须足够大
int main()
{char arr1[20] = "abcdefghi";char arr2[3] = "";strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}
🔴(4)目标空间必须可以修改👇
//这也是一个错误示范 - 目标空间必须可以修改
int main()
{ char *p = "abcdefghi";char arr2[20] = "hehe";strcpy(p, arr2);printf("%s\n", p);return 0;
}
🔴(5)模拟实现 strcpy函数👇
#include<assert.h>
//返回的是目标空间的起始地址
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[] = "hehehe";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}

📬1.3. strcat
🚩(1) 源字符串必须以 ‘\0’ 结束
🚩(2) 目标空间也必须有 ‘\0’
🚩(3) 目标空间必须足够大,能容纳下源字符串的内容
🚩(4) 目标空间必须可修改
🚩(5) 字符串给自己追加会如何?
可以参考一下 cplusplus 中的资料👇
🔴(1)请看示例代码👇
#include<string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "world";//追加strcat(arr1,arr2);printf("%s\n", arr1);return 0;
}

🔴(2)模拟实现 strcat函数👇
#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;//找目标空间中的 \0while (*dest != '\0'){dest++;}//拷贝while(*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = "hello ";char arr2[] = "world";//追加my_strcat(arr1,arr2);printf("%s\n", arr1);return 0;
}
🔴(3) 字符串给自己追加会如何?👇
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while (*dest != '\0'){dest++;}//拷贝while(*dest++ = *src++){;}return ret;
}
int main()
{char arr1[20] = "hello";my_strcat(arr1, arr1);printf("%s\n", arr1);return 0;
}
🚨会陷入死循环,根本停不下来‼️
🚨因为在第一轮拷贝中 ‘\0’就被赋值了’h‘,所以一直往后找再也找不到 ’\0‘了,陷入死循环
📬1.4. strcmp
🔴比较2个字符串的内容的时候,不能使用==,应该使用strcmp
🔴if (“abcdef” == “bbcdef”) 这里比较的是两个字符串首字母的地址,而不是字符串的内容
🚩(1) 比较2个字符串的内容的时候,不能使用==,应该使用strcmp
🚩(2) if (“abcdef” == “bbcdef”) 这里比较的是两个字符串首字母的地址,而不是字符串的内容
🚩(3) 比较的是对应位置上字符的 ASCII码值的大小
可以参考一下 cplusplus 中的资料👇
📍第一个字符串大于第二个字符串,则返回大于0的数字
📍第一个字符串大于第二个字符串,则返回0
📍第一个字符串大于第二个字符串,则返回小于0的数字
🔴(1)请看示例代码👇
#include<stdio.h>
#include<string.h>int main()
{//比较的是对应位置上字符的 ASCII码值的大小char arr1[] = "abcdef";char arr2[] = "abq";int ret = strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}

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

🔴(2)模拟实现 strcmp函数👇
#include<stdio.h>
#include<string.h>
#include<assert.h>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;
}int main()
{char arr1[] = "abcdef";char arr2[] = "abq";int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}
📬1.5. strncpy
🔴长度不受限制的字符串函数:strcpy , strcat , strcmp
🔴长度受限制的字符串函数:strncpy , strncat , strncmp

🌰举个栗子👇
int main()
{char arr1[] = "abcdef";char arr2[5] = "yuio";strncpy(arr1, arr2, 3);printf("%s\n", arr1);return 0;
}

📬1.6. strncat

🌰举个栗子👇
int main()
{char arr1[20] = "hello";char arr2[] = "yuio";strncat(arr1, arr2, 3);printf("%s\n", arr1);return 0;
}

可以自己追加自己👆
📬1.7. strncmp

🌰举个栗子👇
int main()
{char arr1[] = "abcdef";char arr2[] = "abcq";int ret = strncmp(arr1, arr2, 4);printf("%d\n", ret);return 0;
}

总结🥰
以上就是 字符函数和字符串函数【上篇】 的内容啦🥳🥳🥳🥳
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
欲知后事如何,请听下篇分解喽😘😘😘
希望我们可以做一个用心的人💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰
相关文章:
字符函数和字符串函数【上篇】
文章目录🎖️1.函数介绍📬1.1. strlen📬1.2. strcpy📬1.3. strcat📬1.4. strcmp📬1.5. strncpy📬1.6. strncat📬1.7. strncmp🎖️1.函数介绍 📬1.1. strlen …...
list的模拟实现(模仿STL)
目录 一、模拟实现前的准备 1.list结构认识 2.迭代器的实现不同 3.如何实现需要的功能 二.结点类实现 三.迭代器实现 1.实现前的问题 2._list_iterator类的成员变量和构造函数 3.*和->运算符重载 4.前置和后置的实现 5.前置--和后置-- 6.和!运算符重载 四.list类的实现 1.li…...
05-STM32F1 - 串行通信SPI
SPI STM-SPI作为主机,从机 SPI的时钟,最高为Pclk/2,SPI1最高为36Mhz,SPI2最高为18Mhz。 SPI的四种模式 CPOL CPHA,数据帧8~16位,LSB,MSB 全双工,双向单线,单线 物理层 接口标准…...
【Pytorch】Tensor的分块、变形、排序、极值与in-place操作
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 这是目录Tensor的分块Tensor的变形Tensor的排序Tensor的极值Tensor的in-place操作Tensor是PyTorch中用于存储和处理多维数据的基本数据结构,它类似于NumPy中的ndarray&…...
数组栈的实现
个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 目录所有接口函数栈的初始化在栈顶放数据释放数据删除数据取栈顶的数据判断栈取区是否为…...
*p++,*(p++),*++p,(*p)++区别?
*p++:等同于:*p; p += 1; 解析:由于和++的运算优先级一样,且是右>结合。故p++相当于*(p++),p先与++结合,>然后p++整体再与结合。前面陈述是一种最 常见的错误,很多初学者也是这么理解的。 但是,因为++后置的时候,本身含义就是先 运算后增加1(运算指的是p++作为…...
又一个线上偶发问题-系统短暂无法获取到Redis连接
概述 最近不知道咋回事,老是在线上遇到偶发的故障,它突然出现,又很快消失了。 在2023年3月11下午差不多六点左右,我正在工位上喝着香味扑鼻的金骏眉红茶,突然接到了一个电话,拿起手机一看,是阿里…...
[ 系统安全篇 ] 拉黑IP - 火绒安全软件设置IP黑名单 windows使用系统防火墙功能设置IP黑名单
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
MongoDB【部署 01】mongodb最新版本6.0.5安装部署配置使用及mongodb-shell1.8.0安装使用(云盘分享安装文件)
云盘分享文件: 链接:https://pan.baidu.com/s/11sbj1QgogYHPM4udwoB1rA 提取码:l2wz 1.mongodb简单介绍 MongoDB的 官网 内容还是挺丰富的。 是由 C语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下&…...
算法竞赛必考算法——动态规划(01背包和完全背包)
动态规划(一) 目录动态规划(一)1.01背包问题1.1题目介绍1.2思路一介绍(二维数组)1.3思路二介绍(一维数组) 空间优化1.4思路三介绍(输入数据优化)2.完全背包问题2.1题目描述:2.2思路一(朴素算法)2.3思路二(将k优化处理掉)2.4思路三(优化j的初始条件)总结1.01背包问题…...
基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
摘要:农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注、记录和保存病害位置和类型,辅助作物病害防治以增加产值。本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统,在介绍算法原理的同时&#…...
QT入门Item Views之QListView
目录 一、QListView界面相关 1、布局介绍 二、代码展示 1、创建模型,导入模型 2、 设置隔行背景色 3、删除选中行 三、源码下载 此文为作者原创,创作不易,转载请标明出处! 一、QListView界面相关 1、布局介绍 先看下界面…...
GEE:计算1990-2021年的指数最大值和最小值,并根据最大最小值对每一副影像归一化
本文记录了在GEE平台上计算影像集合中所有像素的最大值和最小值。并且根据该最大最小值对所有影像进行最大最小值归一化。以SAVI为例,记录了主要函数的使用方法和代码。 结果如图所示, 文章目录 一、计算每一副影像的最大值或者最小值,并将最值保存在 List 中二、计算 Lis…...
LeetCode KMP 算法
可以参考https://www.bilibili.com/video/BV1AY4y157yL/kmp 主要做的就是子串匹配,类似C程序的 strstr() 函数记录一下,也防止我自己忘记传统暴力求解算法是源串 ssssssssa 子串 sssa(下面暴力求解) 先 (子串从 0 位置匹配&#x…...
全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里
最强的文本生成模型GPT-4一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展四、与之前 GPT 系列模型比较五、…...
leetcode——26. 删除有序数组中的重复项
文章目录🐨1. 题目🏹2. 思路🪃3. 代码实现🐨1. 题目 给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。 由…...
基于springboot垃圾分类网站设计实现【毕业论文、源码】
摘要本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述垃圾分类网站的当前背景以及系统开发的目的&#x…...
计算机组成原理实验一(完整)
在VC中使用调试功能将下列语句运行的内存存放结果截图,每运行一句需截图一次。 #include<stdio.h> int main() {int a 你的学号末两位-100; //0x????????&#x…...
【SSM】MyBatis(一.基础)
文章目录1.ORM2. 数据库表3. 入门程序3.1 创建项目3.2 开发3.3 一个比较完整规格的mybatis程序3.4 测试案例 junit3.5 对第一个mybatis使用junit测试3.6 集成日志框架logback3.7mybatis工具类编写1.ORM Object(JVM中的Java对象) Relational(关系型数据库) Mapping(映射) mybat…...
LInux指令之文件目录类
文章目录一、帮助指令二、文件目录类ls指令cd指令 (切换目录)mkdir指令(创建目录)rmdir指令(删除目录)touch指令(创建空文件)cp指令(拷贝文件)rm指令mv指令cat指令(查看)more指令les…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
DriveGPT4: Interpretable End-to-end Autonomous Driving via Large Language Model
一、研究背景与创新点 (一)现有方法的局限性 当前智驾系统面临两大核心挑战:一是长尾问题,即系统在遇到新场景时可能失效,例如突发交通状况或非常规道路环境;二是可解释性问题,传统方法无法解释智驾系统的决策过程,用户难以理解车辆行为的依据。传统语言模型(如 BERT…...




