c语言中的字符串函数

strstr函数

函数介绍

strstr 用于在一个字符串中查找另一个字符串的首次出现。 

我们来看这个函数的参数名字:haysytack(干草堆)needle(针),这个其实就是外国的一句谚语:在干草堆中找一根针,就类似于我们中国的大海捞针一样,很有趣。也在某种程度上对应了这个函数的用途。

示例:

char *s = "abcd.txt";
char *p = strstr(s, ".wps");

if(p == NULL)
    printf("文件[%s]不是WPS文件\n", s);
else
    printf("文件[%s]是WPS文件\n", s);

strchr函数和strrchr函数 

函数介绍

  1. 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c
  2. strchr() 从左往右找,strrchr() 从右往左找。都是查找某个字符的首次出现
  3. 字符串结束标记 ‘\0’ 被认为是字符串的一部分。

示例:

char *p;

p = strchr("www.qq.com", '.'); // 从左到右找到第一个出现的字符'.'
printf("%s\n", p);             // 输出 ".qq.com"

p = strrchr("www.qq.com", '.');// 从右到左找到第一个出现的字符'.'
printf("%s\n", p);             // 输出 ".com"

strstr是否可以替代strchr

  • 相似点strstrstrchr 都可以在字符串中查找特定的内容,并返回指向该内容在字符串中位置的指针。
  • 不同点strstr 查找子字符串,而 strchr 查找单个字符。

从技术上讲,你可以用 strstr 来替代 strchr 的功能,因为 strstr 可以查找单个字符组成的子字符串。

虽然 strstr 可以用来查找单个字符组成的字符串,从而实现与 strchr 类似的功能,但在实际应用中,strchr 更加简洁和直接地用于查找单个字符。因此,虽然 strstr 可以囊括 strchr 的功能,但在需要查找单个字符时,通常推荐使用 strchr,以使代码更具可读性和表达力

strlen函数 

函数介绍

示例:

char *s = "www.baidu.com.cn";
printf("百度官网地址的长度是:%d\n", strlen(s));

且我们的是返回字符长度,不是总空间的大小,和sizeof操作符不一样。 

strcmp函数和strncmp

函数介绍

它可以帮助我们比较指针指向的字符串的大小 

  • 比较字符串大小,实际上比较的是字符的 ASCII码值的大小。
  • 从左到右逐个比较两个字符串的每一个字符,当能“决出胜负”时立刻停止比较。

示例 

printf("%d\n", strcmp("abc", "abc")); // 输出0,两个字符串相等
printf("%d\n", strcmp("abc", "aBc")); // 输出1,"abc" 大于 "aBc"
printf("%d\n", strcmp("999", "aaa")); // 输出-1,"999" 小于 "aaa"

printf("%d\n", strcmp("abcd", "abce")); // 输出-1,"abcd" 小于 "abce"
printf("%d\n", strcmp("abcd", "abce",3 )); // 输出0,"abcd" 和 "abce"前三个字符一样
    char a[]="abc";
    char b[]="bc";
    printf("%d\n", strcmp(a, b)); // 输出-1,a指向的字符串<b指向的字符串

//    if(a==b){//这样是不行的,因为这样是比较了我们指针指向的地址的大小是否相等
//        printf("%s","same");
//    }
//    else{
//        printf("%s","not same");
//    }
//手写代码
    if(*a<*b){
        printf("%s","a<b");
    }
    if(*a>*b){
        printf("%s","a>b");
    }
    if(*a==*b){
        printf("%s","a==b");
    }

1.比较字符串并不要求两个字符串一样长。"za">"abcde"       "abc">"ab"

2.strlen可以帮助我们由指针来直接比较指向内容的字符串大小,不用解引用,并且比手写代码比较更加简洁

strtok函数

函数介绍

1.当strtok在参数s的字符串中发现到参数sep的分割字符时则会将该字符改为’\0’字符 

2.在第一次调用时,strtok必须赋予参数str字符串,往后的调用则将参数s设置成NULL,并且要赋予分隔符串,比如分隔符串",; "这里便包含了三个分割符,表示str中的这三种符号都将会被视作分割标识,我们的strtok函数将会将字符串中的这三种符号都换为’\0’。

3.在这里要分割字符串str,我们每次调用strtok的话首先会返回的是指向第一个分割串的指针,调用第二次的话返回的是指向第二个分割串的指针,直到最后返回NULL表示分割完成。

4.strtok会修改原字符串,所以原字符串必须可修改,所以第一个参数不能用指向字符串常量的指针来作为参数,因为字符串常量中的内容不能改变,必须使用字符数组来存储我们要分割的字符串。

示例:将分割好的字符串按行打印

1.这里采用while是非常合适的.

2.这里假如不定义字符数组而是定义了char *s = "abcd,1234,xy;888,666 999",那么将得不到正确的结果,上面也说过了,这个函数必须可以修改原来的字符串。对于字符串常量的话我们对其是不可以修改的。所以这里必须定义的是字符数组。

3.strtok 函数的行为是它会将连续的分隔符视为一个分隔符,而不会返回空的标记。

对于上面的s数组,写成s[]="abcd,,,,1234,xy;888,666  999"这样也是得到相同的结果。

strcat函数和strncat函数(更安全)

函数介绍

  1. 这两个函数的功能,都是将 src 中的字符串,复制拼接到 dest 的末尾。
  2. strcat() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
  3. strncat() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 的末尾

示例:

char s1[10] = "abc";
strcat(s1, "xyz");
printf("%s\n", s1); // 输出 "abcxyz"

char s2[10] = "abc";
strcat(s3, "123456789"); // 此处操作内存溢出,可能会发生内存崩溃


char s[10]  = "abc";
strncat(s, "123456789", sizeof(s)/sizeof(char)-strlen(s)-1);
printf("%s\n", s); // 输出 "abc123456",两个字符串被拼接到了一起,且不会溢出

1.有时候可能我们使用strcat来拼接了超过实际内存所能存储的字符,我们输出了之后也正常输出,没错误,可能就有侥幸心理,实际上这纯属偶然并且这就相当于埋下了一颗地雷,指不定哪天就出错了,所以更推荐使用strncat这个版本,更加安全。

2.这里拼接操作很显然会改变字符数组存储的数据,所以这里的第一个参数也必须是字符数组,不能是一个字符串常量。

strcpy函数和strncpy函数(更安全)

函数介绍

  1. 这两个函数的功能,都是将 src 中的字符串,复制到 dest 中,dest原本内容被覆盖
  2. strcpy() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
  3. strncpy() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 中。

示例:

char s1[5] = "abc";
strcpy(s1, "xyz);
printf("%s\n", s1); // 输出 "xyz",原有的"abc"被覆盖

char s2[5] = "abc";
strcpy(s2, "123456789"); // 此处操作内存溢出,可能会发生内存崩溃


char s[5] = "abc";
strncpy(s, "123456789", sizeof(s)/sizeof(char)-1);
printf("%s\n", s); // 输出 "1234",有边界保护,不会溢出

1.更推荐使用strncat这个版本,更加安全。

2.这里的第一个参数也必须是字符数组,原因还是这里我们需要对字符数组进行修改,字符串常量是不能被修改的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Type-C PD芯片:引领充电技术的新纪元

随着科技的飞速发展&#xff0c;人们对电子设备的依赖日益加深&#xff0c;对充电速度、效率和安全性的要求也越来越高。在这样的背景下&#xff0c;Type-C PD&#xff08;Power Delivery&#xff09;芯片应运而生&#xff0c;以其高效、安全、智能的特点&#xff0c;成为了充电…

SAP PP学习笔记26 - User Status(用户状态)的实例,订单分割中的重要概念 成本收集器,Confirmation(报工)的概述

上面两章讲了生产订单的创建以及生产订单的相关内容。 SAP PP学习笔记24 - 生产订单&#xff08;制造指图&#xff09;的创建_sap 工程外注-CSDN博客 SAP PP学习笔记25 - 生产订单的状态管理(System Status(系统状态)/User Status(用户状态)),物料的可用性检查&#xff0c;生…

nssm的下载和使用

nssm&#xff08;Non-Sucking Service Manager&#xff09;是一个用于在Windows系统上管理服务的工具。它允许你将.exe文件和.bat文件转换为Windows服务&#xff0c;并提供了一些功能来管理这些服务。 下载和安装 首先&#xff0c;你需要从nssm官方网站&#xff08;https://n…

STM32智能停车场管理系统教程

目录 引言环境准备智能停车场管理系统基础代码实现&#xff1a;实现智能停车场管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;停车场管理与优化问题解决方案与优化收尾与总结 1. 引言 智能停车场管…

echarts 实现水利计算模型-雨量,流量,时间分割线

需求背景解决效果ISQQW代码地址index.vue 需求背景 实现水利计算模型-雨量&#xff0c;流量&#xff0c;时间分割线 解决效果 ISQQW代码地址 链接 index.vue <!--/** * author: liuk * date: 2024/06/13 * describe: 洪水预报结果图表 */--> <template><di…

MySQl高级篇-事务、锁机制、MVCC

存储引擎的选择 在选择存储引擎时&#xff0c;应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统&#xff0c;还可以根据实际情况选择多种存储引擎进行组合。 InnoDB&#xff1a;是Mysql的默认存储引擎&#xff0c;支持事务、外键。如果应用对事务的完整性有比较…

MMLab-dataset_analysis

数据分析工具 这里写目录标题 数据分析工具dataset_analysis.py数据可视化分析 benchmark.pybrowse_coco_json.pybrowse_dataset.pyOptimize_anchors mmyolo、mmsegmentation等提供了数据集分析工具 dataset_analysis.py 数据采用coco格式数据 根据配置文件分析全部数据类型或…

【开源】开源数据库工具推荐

Mysql开源工具推荐 dbeaver下载网速太慢了&#xff0c;这么好用的开源工具&#xff0c;可以从镜像站中下载&#xff1a; 下载地址&#xff1a; https://mirrors.nju.edu.cn/github-release/dbeaver/dbeaver/24.1.1/ Redis开源工具推荐 好看好用&#xff0c;UI真是做的很不…

PE文件(九)导出表

引入导出表 Win32下的一个PE文件&#xff0c;是由多个PE文件组成。比如通过OD打开一个Ipmsg.exe&#xff0c;查看模块M&#xff0c;会发现模块有一个ipmsg.exe文件和多个动态链接库.dll文件。 当一个exe文件通过使用动态链接库.dll的方式导出某.dll文件某函数进行使用时&#…

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行&#xff0c;下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机&#xff0c;上位机将信息进行处理展示判断下位机传感器数据&#xff0c;如果超过设置的阈值&a…

Puppeteer动态代理实战:提升数据抓取效率

引言 Puppeteer是由Google Chrome团队开发的一个Node.js库&#xff0c;用于控制Chrome或Chromium浏览器。它提供了高级API&#xff0c;可以进行网页自动化操作&#xff0c;包括导航、屏幕截图、生成PDF、捕获网络活动等。在本文中&#xff0c;我们将重点介绍如何使用Puppeteer…

项目部署笔记

1、安全组需开放&#xff08;如果不开放配置nginx也访问不到&#xff09; 2、域名解析配置IP(子域名也需配置IP&#xff0c;IP地址可以不同) 3、如果出现图片获其他的文件找不到的情况请仔细检查一下路径是否正确 4、服务器nginx配置SSL证书后启动报错&#xff1a; nginx: […

嘉立创EDA隐藏地线或者

https://prodocs.lceda.cn/cn/pcb/side-panel-left-net/#%E9%A3%9E%E7%BA%BF

Ceph集群部署(基于ceph-deploy)

目录 部署Ceph集群的方法 Ceph生产环境推荐 部署Ceph实验&#xff08;基于ceph-deploy&#xff09; 一、准备工作 二、环境准备 1.关闭selinux与防火墙 2.修改主机名并且配置hosts解析映射 3.admin管理节点配置ssh免密登录node节点 4.安装常用软件和依赖包 5.配置时间…

807.力扣每日一题7/14 Java(执行用时分布击败100%)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 首先…

C语言--递归

曾经有一个段子&#xff1a;上大学时&#xff0c;我们的c语言老师说&#xff1a;学c时&#xff0c;如果有50%的同学死在了循环上面&#xff0c;那么就有90%的同学死在了递归上面。接下来&#xff0c;就来看看递归是怎么个事&#xff1f; 一.递归的介绍 递归是指一个函数直接或…

护佑未来!引领儿童安全新时代的AI大模型

引领儿童安全新时代的AI大模型 一. 前言1.1 AI在儿童安全方面的潜在作用1.2 实时监控与预警1.3 个性化安全教育与引导1.4 家长监护与安全意识提升 二. AI大模型的优势2.1. 保护儿童隐私和安全的重要性2.2. AI大模型如何应用于儿童安全领域2.1 儿童内容过滤2.2.1 儿童行为监测 2…

算法力扣刷题记录 四十四【222.完全二叉树的节点个数】

前言 二叉树篇继续。 记录 四十四【222.完全二叉树的节点个数】 一、题目阅读 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都…

Java时间复杂度介绍以及枚举

时间复杂度 从小到大&#xff1a; O(1) 常数阶。复杂度为O(1)与问题规模无关 线性阶 O&#xff08;n&#xff09;比如一个for循环中代码执行n遍 n阶 对数阶 int n9; int i1; while(i<n) { i*2; } 2^x>n时候退出。次数xlog2^n 时间复杂度为O(logN) 根号阶 int…

09 函数基础

目录 一、定义一个函数 二、调用函数 三、函数的参数 1.形参和实参 2. 参数的分类 3.参数默认值 4.参数类型说明 5.不定长参数 四、函数的返回值 1.定义 2.关键字return 五、变量的作用域 六、匿名函数 七、实参高阶函数 1.定义 2.常见实参高阶函数 max、min、so…