c语言的字符串函数详解

文章目录
- 前言
- 一、strlen求字符串长度的函数
- 二、字符串拷贝函数strcpy
- 三、链接或追加字符串函数strcat
- 四、字符串比较函数strcmp
- 五、长度受限制字符函数
- 六、找字符串2在字符串1中第一次出现的位置函数strstr
- 七、字符串切割函数strtok(可以切割分隔符)
- 八、翻译错误码所对应的错误信息strerror
前言
在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列的库函数,接下来我们就学习⼀下这些函数。
一、strlen求字符串长度的函数
size_t strlen ( const char * str )
这个函数是我们之前用的最多的函数了,所以相对之下也比较熟悉,这里也就简单地概括一下,讲下注意点,这个函数他'/0'零作为结束标志注意和sizeof的区别。他的模拟实现有三种方法http://t.csdnimg.cn/PXwTV,以前写过,就不多说了。
二.字符串拷贝函数strcpy
char* strcpy(char * destination, const char * source );
2.1使用
destination这个是目的,source这个是源头,字符拷贝的意思就是把源头的数据拷贝到目的中去。使用之前引用头文件<string.h>。
int main()
{char name[20] = { 0 };strcpy(name,"zhangsan");printf("%s",name);return 0;
}
打印的结果就是zhangsa,但是要注意,目地空间必须是可以改变的改变的,不可以为常量字符串。注意:1.它以'/0'结束。2.它会把'/0'也拷入目地空间。3.目的空间必须足够大,不然会越界。
2.2模拟实现
my_strcpy(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while (src){*dest++ = *src++;}*dest = *src;//拷贝/0return ret;
}
为这个代码,他最后是要返回目的的数组,所以在开始前,我得先把他的地址拷贝起来
三.链接或追加字符串函数strcat
char* strcat(char * destination, const char * source );
3.1使用
int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s", arr1);return 0;
}
打印结构就是hello world,用法根之前同理,目标空间必须足够大,而且是要可修改的,目标字符串中也得有 \0,否则没办法知道追加从哪里开始。
3.2模拟实现
my_strcat(char* dest, const char* src)
{//assert(dest && src);//找到dest的/0char* ret = dest;while (*dest != '\0'){dest++;}//拷贝字符while (*src){*dest++ = *src++;}*dest = *src;//拷贝/0return ret;}
3.3字符串自己给自己追加,如何?
先说结论是不能自己给自己追加的
因为自己会把/0覆盖,导致没有/0会陷入一种死循环

四.字符串比较函数strcmp
char* strcmpchar * destination, const char * source );
4.1使用
比较字符串函数注意比较的,不是长度比的是asc码值
int main()
{char arr1[20] = "abcd";char arr2[20] = "cdf";int a=strcmp(arr1, arr2);printf("%d",a);return 0;
}
打印结果为-1,所以说如果arr1比arr2小就会返回-1,等于就会返回0,大于就会返回1。

4.2模拟实现
int my_strcmp(char* str1, const char* str2)
{//assert(str1 && str2);while (*str1 == *str2){//相等if (*str1=='\0' || *str2=='\0'){return 0;}str1++;str2++;}return (*str1 - *str2);}
五.长度受限制字符函数
以上就是长度不受限制的函数,长度受限制的函数要更加安全,在它们的后面添加数字n就可以自己去定义,strncpy,strncat,strncmp
( char * destination, const char * source, size_t num );
举一个例子:

六.找字符串2在字符串1中第一次出现的位置函数strstr
char * strstr ( const char * str1, const char * str2)
6.1使用
int main()
{char str[] = "This is a simple string";char* pch = strstr(str, "simple");if (pch == NULL){printf("不存在");}elseprintf("%s\n", pch);return 0;
}
打印结果为simple string,说明如果找到了的话它就会返回一个地址
6.2模拟实现
他的模拟实现是比较复杂的,我们要分两种情况去考虑
情况1(一次就匹配就找到了)

情况2(多次匹配才可以找到)

char* my_strstr(const char* str1, const char* str2)
{//定义3个变量,s1,s2用来比较,cur用来解决第2种情况const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;//cur不为空就一直走while (cur){s1 = str1;s2 = str2;//到了\0就停,不相等也停while(*s1!='\0' && *s2!='\0' && *s1==*s2){s1++;s2++;}//如果是s2到0了,说明找到了if (*s2 == '\0'){return cur;}//可能存在第2找情况cur++;}//说明没有找到return NULL;
}
七.字符串切割函数strtok(可以切割分隔符)
char * strtok ( char * str, const char * sep);
这个函数的使用比较难,所以我们这里之讲解它的使用。
使用
注意:strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针,strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
所以说只用一个是无法找完所以的,要配合循环语句一起使用
int main()
{char arr[] = "192.168.6.111";char* sep = ".";char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}
八.翻译错误码所对应的错误信息strerror
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来
1.No error
2.Operation not permitted
3.No such file or directory
4.No such process
5.Interrupted function call
6.Input / output error
7.No such device or address
8.Arg list too long
9.Exec format error
10.Bad file descriptor
11.No child processes
常见的错误信息

相关文章:
c语言的字符串函数详解
文章目录 前言一、strlen求字符串长度的函数二、字符串拷贝函数strcpy三、链接或追加字符串函数strcat四、字符串比较函数strcmp五、长度受限制字符函数六、找字符串2在字符串1中第一次出现的位置函数strstr七、字符串切割函数strtok(可以切割分隔符)八、…...
HarmonyOS NEXT应用开发—折叠屏音乐播放器方案
介绍 本示例介绍使用ArkUI中的容器组件FolderStack在折叠屏设备中实现音乐播放器场景。 效果图预览 使用说明 播放器预加载了歌曲,支持播放、暂停、重新播放,在折叠屏上,支持横屏悬停态下的组件自适应动态变更。 实现思路 采用MVVM模式进…...
Java项目:55 springboot基于SpringBoot的在线视频教育平台的设计与实现015
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 在线视频教育平台分为管理员和用户、教师三个角色的权限模块。 管理员所能使用的功能主要有:首页、个人中心、用户管理、教师管理、课程信…...
说下你对TCP以及TCP三次握手四次挥手的理解?
参考自简单理解TCP三次握手四次挥手 什么是TCP协议? TCP( Transmission control protocol )即传输控制协议,是一种面向连接、可靠的数据传输协议,它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接&a…...
wsl-oracle 安装 omlutils
wsl-oracle 安装 omlutils 1. 安装 cmake 和 gcc-c2. 安装 omlutils3. 使用 omlutils 创建 onnx 模型 1. 安装 cmake 和 gcc-c sudo dnf install -y cmake gcc-c2. 安装 omlutils pip install omlutils-0.10.0-cp312-cp312-linux_x86_64.whl不需要安装 requirements.txt&…...
Python类属性和对象属性大揭秘!
在Python中,对象和类紧密相连,它们各自拥有一些属性,这些属性在我们的编程中起着至关重要的作用。那么,什么是类属性和对象属性呢?别急,让我慢慢给你解释。 类属性 首先,类属性是定义在类本…...
北斗卫星在桥隧坡安全监测领域的应用及前景展望
北斗卫星在桥隧坡安全监测领域的应用及前景展望 北斗卫星系统是中国独立研发的卫星导航定位系统,具有全球覆盖、高精度定位和海量数据传输等优势。随着卫星导航技术的快速发展,北斗卫星在桥隧坡安全监测领域正发挥着重要的作用,并为相关领域…...
如何通过堡垒机JumpServer使用VisualCode 连接服务器进行开发
前言:应用场景 我们经常会碰到需要远程登录到内网服务器进行开发的场景,一般的做法都是通过VPN登录回局域网,然后配置ftp或者ssh使用开发工具链接到服务器上进行开发。如果没有出现问题,那么一切都正常,但到了出现问题…...
【Linux】进程优先级
🌎进程的优先级 文章目录: 进程状态 优先级相关 什么是优先级 为什么要有优先级 进程的优先级 调整进程优先级 调整优先级 优先级极限测试 Linux的调度与切换 总结 前言: 进程…...
Fair Data Exchange:区块链实现的原子式公平数据交换
1. 引言 2024年斯坦福大学和a16z crypto research团队 论文 Atomic and Fair Data Exchange via Blockchain 中,概述了一种构建(包含过期EIP-4844 blobs的)fair data-markets的协议。该论文源自a16z crypto的暑期实习计划,与四名…...
详解优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器
代码示例在最后。 认识一下ThreadPoolTaskExecutor org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor这是由Sping封装的加强版线程池,其实是Spring使用装饰者模式对ThreadPoolExecutor进一步优化。 它不仅拥有ThreadPoolExecutor所有的核心参数…...
Vue3+TS+Vite 找不到模块“@/components/xxx/xxx”或其相应的类型声明
引入vue文件时文件是存在的,引入路径也是对的,报找不到模块,有一些解决方案是在tsconfig.json里面做一些配置,大家可以自行百度(不知道是不是我百度的不对,我的没有解决)还有一种是在项目根目录…...
Vue3-响应式基础:单文件和组合式文件
单文件:html <!DOCTYPE html> <html> <head><title>响应式基础</title> </head> <body><div id"app" ><!-- dynamic parameter:同样在指令参数上也可以使用一个 JavaScript 表达式,需要包…...
DVWA-File Upload文件上传
什么是文件上传漏洞? 黑客利用文件上传后服务器解析处理文件的漏洞上传一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。 造成文件上传漏洞的原因: 1.服务器配置不当 2.开源编辑器上传漏洞 3.本地文件上传限制被绕过 4.过滤不严格被…...
python之word操作
#pip install python-docx import docx import os pathos.path.abspath(__file__) file_pathos.path.join(path,"大题.docx") print(path) print(file_path) objdocx.Document("大题.docx") #第一个段落 p1obj.paragraphs[2] # print(p1.text) #所有段落 #…...
Linux下新增有root权限的用户
步骤: 1.以 root 用户身份登录到 CentOS 服务器。 2.使用以下命令创建新用户(将 newuser 替换为您想要创建的用户名): sudo adduser username 3.为新用户设置密码: sudo passwd username 按照提示输入新增用户密码 …...
RPC通信原理(一)
RPC通信原理 RPC的概念 如果现在我有一个电商项目,用户要查询订单,自然而然是通过Service接口来调用订单的实现类。 我们把用户模块和订单模块都放在一起,打包成一个war包,然后再tomcat上运行,tomcat占有一个进程&am…...
修改/etc/resolve.conf重启NetworkManager之后自动还原
我ping 百度报错: [rootk8snode1 ~]# ping baidu.com ping: baidu.com: Name or service not known很明显,这是DNS解析问题。 于是我修改 /etc/resolv.conf 文件后,执行完sudo systemctl restart NetworkManager,/etc/resolv.con…...
Web前端依赖版本管理最佳实践
本文需要读者懂一点点前端的构建知识: 1. package.json文件的作用之一是管理外部依赖;2. .npmrc是npm命令默认配置,放在工程根目录。 Web前端构建一直都是一个不难,但是非常烦人的问题,在DevOps、CI/CD领域。 烦人的是…...
多线程进阶
一.常见的锁策略 这里所讲的锁,不是一把具体的锁,而是锁的特性 1.乐观锁和悲观锁 悲观乐观是对锁冲突大小的预测 若预测锁冲突概率不大,就可能会少一些工作,那就是乐观锁;反之就是悲观锁 总是假设最坏的情况&…...
零基础轻松拿捏!魔珐星云青少年健康运动教学数字人搭建全流程指南
大家好!本次给大家分享一款面向青少年体育教育的AI创意实践项目——青少年健康运动教学智能数字交互系统。本项目聚焦青少年体质健康痛点,围绕体育教学智能化升级需求,打造集健康知识教学、运动动作陪练、健康知识考核、运动能力评测于一体的…...
别再用SonarQube凑数了!DeepSeek原生圈复杂度引擎的6大颠覆性能力(含GitHub私有部署密钥)
更多请点击: https://kaifayun.com 第一章:DeepSeek圈复杂度分析的底层原理与范式革命 DeepSeek圈复杂度分析并非传统McCabe度量的简单复刻,而是基于控制流图(CFG)动态重构与语义感知路径裁剪的双重机制构建的新范式。…...
大佬推荐的网络安全学习路线(从基础到高级,超级详细)
大佬推荐的网络安全学习路线(从基础到高级,超级详细) 说起网络安全,你可能会担心它是一个过时的行业。有人说,网络安全快卷死了,你既要攻又要防,并且随着技术的发展,你还要不断地学…...
【紧急预警】Lindy衰减临界点已提前至第8.3个月!2024最新《营销自动化寿命健康度白皮书》限时开放前500份
更多请点击: https://kaifayun.com 第一章:Lindy衰减临界点的理论重构与实证突破 Lindy效应传统上描述“越老越长寿”的非线性生存规律,但其在现代软件系统、开源生态与协议层技术栈中的适用边界正遭遇结构性挑战。本文首次将Lindy模型从静…...
如何快速掌握ncmdumpGUI:Windows平台网易云音乐NCM文件转换完整教程
如何快速掌握ncmdumpGUI:Windows平台网易云音乐NCM文件转换完整教程 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的…...
每日一书㉗ | 刻意练习:为什么有些人努力一辈子还是平庸?
“本文来自「乐想屋」公众号,系列更新[每日一书],每次5分钟,帮你把书读薄,把知识用活”先问你一个问题。你身边有没有这样的人:入行时间比你短,但能力已经甩你好几条街。他们好像没有特别刻苦,但…...
压测不只是加并发:我们模拟真实用户行为后,发现了隐藏瓶颈
在性能测试领域,一个根深蒂固的误解是:压测就是使劲加线程数,看系统什么时候崩。很多团队用 JMeter 起 500 个并发,照着接口列表跑一圈,看到 TPS 平稳、响应时间没超过 300ms,就觉得万事大吉。可一旦上线&a…...
tree 命令
tree 命令 tree 命令用于以树状图的形式列出目录下的文件。 1 Linux 安装 tree 命令 # CentOS sudo yum -y install tree # Ubuntu sudo apt -y install tree2 Windows 安装 tree 命令 Windows 10 以上 CMD 和 PowerShell 已经内置了 tree 命令,可以直接使用。 …...
大语言模型解码加速:自适应层并行机制解析
1. 项目概述:大语言模型解码加速的现状与挑战 在当今大语言模型(LLM)应用中,自回归解码已成为文本生成任务的核心瓶颈。以GPT-3生成长篇内容为例,每个token必须按顺序生成,这种串行依赖严重限制了硬件并行计算能力的发挥。传统解码…...
番茄小说下载器:三步打造你的离线阅读自由王国
番茄小说下载器:三步打造你的离线阅读自由王国 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在通勤路上读到精彩章节时突然断网?是否在长途旅…...
