C语言—常用字符串函数剖析

字符串函数

cplusplus.com/reference/cstring/

更多没有总结到的函数大家可以自行查阅

这篇文章只是把最需要知道的函数做一个总结

image-20240418131842872

strlen

size_t strlen ( const char * str );
  • 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。
  • 参数指向的字符串必须要以 ‘\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的
  • 学会strlen函数的模拟实现
#include <stdio.h>
int main()
{const char*str1 = "abcdef";const char*str2 = "bbb";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}

大家思考一下,这个程序的运行结果是什么?

因为返回的是无符号整型,那么怎么能出来负数呢?

一定要会模拟这个函数

int my_strlen(const char * str)
{int count = 0;while(*str)//"\0"即为0,假{count++;str++;}return count;
}

strcpy

image-20240417230214006

char* strcpy(char * destination, const char * source );
  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。
  • 学会模拟实现。

strcat

image-20240417230559853

字符串追加

  • 源字符串必须以 ‘\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 字符串自己给自己追加,可以吗?

当然是不可以的,字符串内容被修改,无法找到\0,程序会死循环

strcmp

image-20240417231046161

int strcmp ( const char * str1, const char * str2 );

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

长度受限制字符串函数

  • 相对更加安全
  • strncpy
  • strncat
  • strncmp

可以减小我们程序出现问题的可能,大家有兴趣可以下去查一下

这些函数我们最好也尝试自己去实现

strncpy

cplusplus.com/reference/cstring/strncpy/

strncat

cplusplus.com/reference/cstring/strncat/

strncmp

cplusplus.com/reference/cstring/strncmp/

strstr(查找子串)

const char * strstr ( const char * str1, const char * str2 );      char * strstr (char * str1, const char * str2 );

image-20240417232005764

查找str1中是否有str2的字串

找到时返回char*指针,指向字串头指针

找不到是返回空指针

/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{char str[] ="This is a simple string";char * pch;pch = strstr (str,"simple");strncpy (pch,"sample",6);puts (str);return 0;
} 

需要学会实现

这个函数在数据结构中好像有过讲解,以后会写文章详细讲解

strtok(字符串切割)

char * strtok ( char * str, const char * sep );

image-20240417232315504

  • str:要分割的字符串,第一次调用时传入需要分割的字符串,后续调用时传入 NULL。
  • delim:分隔符,即根据此字符集中的任何字符进行分割。

返回值

  • 如果成功找到了分割后的片段,则返回指向该片段的指针。
  • 如果找不到分隔符或者传入的字符串为空,则返回 NULL。

注意

  • 在第一次调用 strtok 时,需要传入要分割的字符串,并且在后续调用中传入 NULL。
  • strtok 函数使用静态变量来保存上一次分割的位置,因此不是线程安全的,应当避免在多线程环境下使用。
  • 分割后的片段会修改原始字符串,将分隔符替换为 NULL,因此在使用返回的片段时要注意不要修改原始字符串。
  • 如果要分割多个字符串,建议使用 strtok_r 函数,它是 strtok 的线程安全版本。

可以看一下演示

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello,world,this,is,a,test";char *token = strtok(str, ",");while (token != NULL) {printf("%s\n", token);token = strtok(NULL, ",");}return 0;
}

以上示例将会输出:

Hello
world
this
is
a
test

这里将字符串按照逗号分割成了多个片段,并依次输出每个片段。

奇奇怪怪的函数

strerror

image-20240418124537108

这个函数就比较有意思了

 char * strerror ( int errnum );

返回错误码,所对应的错误信息。

/* strerror example : error list */
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{FILE * pFile;pFile = fopen ("unexist.ent","r");if (pFile == NULL)printf ("Error opening file unexist.ent: %s\n",strerror(errno));//errno: Last error numberreturn 0;
}
Edit & Run

这个函数是什么意思呢,在C语言的函数库中,函数执行出现异常会自动返回错误码,而这个错误码会自动存储在全局变量

errno

这个变量中,这个变量是C语言自动创建的,而strerror就可以去解读这个错误码

帮我们找到程序异常发生的原因

字符分类函数:

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母af,大写字母AF
islower小写字母a~z
isupper大写字母A~Z
isalpha字母az或AZ
isalnum字母或者数字,az,AZ,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符
  • isspace需要注意一下,不仅仅是空白字符,有一些转义字符也被认为是空白的

字符转换函数:

int tolower ( int c );
int toupper ( int c );
  • 大写变小写或者小写变大写
  • 如果不是字母则不动
/* isupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{int i=0;char str[]="Test String.\n";char c;while (str[i]){c=str[i];if (isupper(c)) c=tolower(c);putchar (c);i++;}return 0;
}

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

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

相关文章

软考 - 系统架构设计师 - 架构风格例题

问题一&#xff1a; 什么是软件架构风格&#xff1f; 软件架构风格指特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件和这些构件的组织方式。惯用模式反映了众多系统所共有的结构和语义。 集成开发环境与用户的交互方式 &#xff08;实际上询问在交互方面&am…

聚观早报 | 华为Pura70系列先锋计划;月之暗面升级Kimi

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月19日消息 华为Pura70系列先锋计划 月之暗面升级Kimi OPPO Find X7将推白色版本 波士顿动力推出人形机器人 v…

Tomcat漏洞利用工具-TomcatVuln

检测漏洞清单 CVE-2017-12615 PUT文件上传漏洞 tomcat-pass-getshell 弱认证部署war包 弱口令爆破 CVE-2020-1938 Tomcat 文件读取/包含项目地址 https://github.com/errors11/TomcatVuln TomcatVuln put文件上传 ajp协议漏洞 默认读取web.xml文件&#xff0c;漏洞利用…

RedHat9 KVM虚拟技术

以下有使用RedHat9单独的虚拟机也有使用RHEL9学员练习机和RHEL7学员练习机 KVM虚拟技术介绍 Linux的KVM(Kernel-based Virtual Machine)虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机,每个虚拟机都有自己的操作系统和…

启动appium服务的2种方法(python脚本cmd窗口)

1.通过cmd窗口命令来启动 2.通过python代码启动 2.1启动单个appium服务 2.2启动多个appium服务 3.端口说明 一.端口号设置Appium服务器端口&#xff1a;4723 bp端口&#xff1a;4724 Appium服务器端口&#xff1a;4725 bp端口&#xff1a;4726可以看到appium服务器端口和bp端…

3D抓取算法的网络结构原理及作用

3D抓取算法是一个基于深度学习的算法&#xff0c;旨在从点云数据中预测出最佳的抓取姿态。该算法的网络结构主要由接近网络、操作网络和容忍网络三个网络组成。下面我将详细讲解这三个网络的原理和作用。 1. ApproachNet&#xff08;接近网络&#xff09; 原理&#xff1a;Ap…

深入浅出Python机器学习:从零开始的SVM教程/厾罗

导言&#xff1a; 在众多机器学习算法中&#xff0c;支持向量机&#xff08;Support Vector Machine, SVM&#xff09;以其强大的分类能力和理论背景受到了广泛的应用。SVM不仅在学术领域表现出色&#xff0c;而且在工业界也有着极高的声誉。本文将带领大家从零开始&#xff0…

【数据库】MySQL数据表记录改操作

修改语句&#xff1a;作用修改记录里的部分值 一、修改单表记录 语法&#xff1a; update 表名 set 字段名1新的值,字段名2新值,.......where 条件; 案例&#xff1a;修改学生表中姓王的同学的班级都改为11601 UPDATE students SET class11601 WHERE sname LIKE 王%; 二、…

Redis快速入门操作

启动Redis 进入命令行客户端 字符串命令常用操作&#xff08;redis默认使用字符串来存储数据&#xff09; 列表&#xff08;Lists&#xff09;常用操作 集合&#xff08;Sets&#xff09;常用操作 &#xff08;无序集合且元素不可重复&#xff09; 有序集合&#xff08;So…

YOLOv9最新改进系列:YOLOv9改进加入新型高效的多尺度注意力(EMA)模块保留每个通道的信息并减少计算成本!助力v9检测性能遥遥领先!

YOLOv9最新改进系列&#xff1a;YOLOv9改进加入新型高效的多尺度注意力&#xff08;EMA&#xff09;模块保留每个通道的信息并减少计算成本&#xff01;助力v9检测性能遥遥领先&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er 详细的改进…

springboot + redis 分布式锁在事务提交后再释放锁

目录 常规做法&#xff1a; 常规加锁&#xff1a; 解决办法&#xff1a; 业务描述&#xff1a;新增一个对象&#xff0c;将数据保存到数据库中&#xff0c;且限制最多只能添加15条。 常规做法&#xff1a; Transactional(rollbackFor Exception.class) public Result add…

PCL SAC_IA配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…

Java web应用性能分析之服务端慢和优化概叙

前面已经分析了客户端慢、前端页面慢、入口Nginx慢&#xff0c;按照上图接下来就是我们服务端重点的接口慢分析优化、服务器资源性能瓶颈分析、服务器带宽性能瓶颈分析。 性能优化的目的 性能优化的目标是提高应用的性能&#xff0c;使其更加高效、稳定和可靠。性能优化包括服…

CSS 格式化上下文 + CSS兼容处理

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍CSS 格式化上下文&#x1f525;1 格式化上下文&#x1f337;1.1 块级格式化…

程序员之路的砥砺前行

成为程序员后&#xff0c;我明白了技术成长的重要性。程序员之路&#xff0c;是一场砥砺前行的旅程&#xff0c;充满了挑战与机遇。在这个过程中&#xff0c;我不仅在技术上取得了显著的成长&#xff0c;还学会了如何持续学习和进步。 记得刚开始学习编程时&#xff0c;我对编…

Kubernetes Pod的配置管理 ConfigMap和Secret

目录 前言 一、为什么需要配置管理 二、使用ConfigMap管理Pod的配置信息 2.1 创建ConfigMap&#xff08;4种方式&#xff09; 2.1.1 指定ConfigMap的参数创建 2.1.2 指定配置文件创建ConfigMap 2.1.3 通过一个文件内的多个键值对创建ConfigMap 2.1.4 yaml文件创建Config…

环境多介质逸度模型实践技术与典型案例【代码】

随着污染物在各种环境中的迁移和转化&#xff0c;多介质污染物模型日益受到关注。在各类多介质模型中&#xff0c;基于逸度概念的逸度模型由于运用范围广&#xff0c;建模数据要求较低而广受欢迎。 专题一&#xff1a;基本理论 1.逸度的定义 2.逸度模型的基本原理 3.各介质…

Java字符流-reader与writer

目录 1、字符流 1.1 Reader 1.2 Writer 1.3 字符流拷贝文件 1.3.1 字符流拷贝文件实现一 1.3.2 字符流拷贝文件实现二 1.4 字符流的异常处理 1.5 字符流的缓冲区 1.6 装饰器模式 1、字符流 计算机并不区分二进制文件与文本文件。所有的文件都是以二进制形式来存储的&…

Golang | Leetcode Golang题解之第36题有效的数独

题目&#xff1a; 题解&#xff1a; func isValidSudoku(board [][]byte) bool {var rows, columns [9][9]intvar subboxes [3][3][9]intfor i, row : range board {for j, c : range row {if c . {continue}index : c - 1rows[i][index]columns[j][index]subboxes[i/3][j/3]…

爆炸之linux-nacos2.0系列集群安装部署

一、环境配置 1、新建磁盘分区 fdisk /dev/vdb 2、创建文件系统 mkfs.xfs /dev/vdb13、创建挂载点&#xff1a; 在 / 目录下创建一个新的目录作为挂载点。/afc 目录 mkdir /afc4、挂载磁盘&#xff1a; 使用 mount 命令将磁盘挂载到新创建的目录。 mount /dev/vdb /afc5、…