字符函数和字符串函数【上篇】
文章目录
- 🎖️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…...

【c++】:STL中vector的模拟使用及模拟实现
文章目录 前言一.使用库中vector常用接口二.vector的模拟实现总结前言 上一篇我们讲解了STL中的string的使用和模拟实现,这次我们就来讲解STL中的vector,vector相对于string来说模拟实现会难一些,难点在于迭代器失效问题和深浅拷贝问题。 首…...

C++ STL:vector的使用方法及模拟实现
目录 一. vector概述 二. vector接口函数的使用方法和模拟实现 2.1 vector类模板的成员变量 2.2 构造函数的使用和模拟实现 2.2.1 构造函数的使用方法 2.2.2 构造函数的模拟实现 2.3 析构函数的模拟实现 2.4 赋值运算符重载函数的使用和模拟实现 2.4.1 函数的使用 2.…...

naive UI 的upload组件自定义手动上传图片的base64位
<template><n-upload ref"uploadRef" action"#" :default-upload"false" :custom-request"myUpload"><n-button>点击选择文件</n-button></n-upload><n-button click"submitUpload"> 上…...

信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画)
信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画) 目录应用背景操作步骤图表常用动画效果:擦除效果表格常用动画效果:轮子效果应用背景 文不如表,表不如图。在平时用ppt做总结时,我们会经常用到图…...

Spring Bean实例化和初始化的过程
承接上文Spring Bean生命周期应用程序在运行过程中能否去读取当前系统的环境变量或系统属性?这里涉及到一个非常重要的接口Environment,System.getenv,System.getProperties都是获取当前系统环境变量,Environment接口的实现类AbstractEnviro…...

WorkTool企微机器人接入智能问答
一、前言 最新版的企微机器人已经集成 Chat ,无需开发可快速搭建智能对话机器人。 从官方介绍看目前集成版本使用模型为 3.5-turbo。 二、入门 创建 WorkTool 机器人 你可以通过这篇快速入门教程,来快速配置一个自己的企微机器人。 实现的流程如图&…...

C导入正则库问题
环境 操作系统:win11 专业版 gcc: gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0 编辑器:vscode 要求 在c中使用正则表达式 遇到的问题以及解决思路 C标准中并没有正则表达式库 从其他地方下载正则表达式库即可。 http://gnuwin32.sourcefo…...

尚融宝05-Node.js入门
目录 一、Node.js的概念 1、JavaScript引擎 2、什么是Node.js 二、下载和安装 1、下载和安装 2、查看安装是否成功 三、初始Node.js程序 1、运行一个程序 常见问题 2、文件的读取 3、服务器端程序 三、Node.js的作用 1、Node.js的应用场景 2、BFF 解决什么问题 …...

「SAP ABAP」OPEN SQL(八)【WHERE语句大全】
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…...

Ribbon负载均衡的原理(源码分析)
SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。1)LoadBalancerIntercepor可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:1.request.getURI():获取请…...