C语言----字符串操作函数汇总

news2024/11/24 19:16:39

        在C的库函数中,有丰富的字符串操作函数,在平时的coding中灵活运用这些库函数会达到事半功倍的效果

一:str系列

char *strcpy(s, ct)将字符串ct(包括'\0')复制到字符串s中,并返回s,需要注意s的长度是否容纳ct。
char *strncpy(s, ct, n)

将字符串ct中最多n个字符复制到字符串s中,并返回s。如果ct中少于n个字符,则用'\0'填充

如果n小于ct的长度,即复制部分ct中的字符,是没有\0的,需要手动添加

在strncpy中,长度指定了多少个字符将被写入到目标字符数组里,如果源字符串比指定指定长度更长,则字符串将不会以\0字节结尾。

char *strcat(s, ct)将字符串ct连接到s的尾部,并返回s,src和dst重叠结果未定义,并且必须保证目标字符数组剩余空间足以容纳整个源字符串
char *strncat(s, ct, n)

将字符串ct中最多前n个字符连接到字符串s的尾部,并以'\0'结束;返回s

strncat函数的长度参数指定从源字符串复制过来的字符的最大数目,但它的结果始终以一个\0字节结尾。

int *strcmp(cs, ct)比较字符串cs和ct;当cs<ct时,返回一个负数;当cs==ct返回0;当cs>ct返回值大于0
int *strncmp(cs, ct,n)比较字符串cs和ct中签n个字符;当cs<ct时,返回一个负数;当cs==ct返回0;当cs>ct返回值大于0
char *strchr(cs, c)返回指向字符c在字符串cs中第一次出现的位置的指针;如果cs中不包括c,则该函数返回NULL
char *strrchr(cs, c)返回指向字符c在字符串cs中最后一次出现的位置的指针,如果cs中不包括c。则返回NULL
size_t strcspn(str1, str2)检索字符串str1开头连续有几个字符都不含字符串str2的字符
size_t strlen(str)计算字符串str的长度,直到空结束字符,但不包含空结束字符
char *strpbrk(str, c)在str字符串中检索第一个匹配str2中字符的字符,返回该位置(不包含\0)
size_t strspn(str1, str2)检索字符串str1中第一个不在字符串str2中出现的字符下标
char *strstr(str1, str2)在str1中查找第一次出现str2的位置
char *strtol(str, delim)以delim为界分割字符串

        在上面的函数中,有些是成对的出现如strcpy和strncpy,strcmp和strncmp,两个函数从命名上看就一字之差,后者加了个n,那是因为前者在某些条件下是不安全的,我们一般称之为不安全函数,后者的出现就是为了弥补不安全函数带来的隐患,但是前者已经使用了多年,也不好在原来的基础上改,所以另起了一个函数。

        我们就以strcpy和strncpy为例来看看为什么说strcpy是不安全的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    // please write your code here
    char *myName = "ftz";

    char oriarr[5] = {0};
    strcpy(oriarr,myName);
    printf("enough space:%s\n",oriarr);

    char oriarr2[2] = {0};
    strcpy(oriarr2,myName);
    printf("not enough space:%s\n",oriarr2);
   
}

结果:

        可以看到,在目的字符串的空间不足的情况下,源字符串还是拷贝过去了,踩到了目的字符串后边的内存,这会产生不可预料的错误。

        在strncpy中增加了一个参数n,可以由调用者自己去灵活的设置需要拷贝的字节数,另外函数的说明里也提示了调用者应该怎么做保证安全。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    // please write your code here
    char *myName = "ftz";

    //strncpy(s, ct, n) normal
    char oriarr[5];
    strncpy(oriarr,myName,4);
    printf("normal:%s\n",oriarr);

    //strncpy(s, ct, n) ct中少于n个字符
    char oriarr2[5];
    strncpy(oriarr2,myName,5);
    printf("ct中少于n个字符:%s\n",oriarr2);

    //strncpy(s, ct, n)  n小于ct的长度  需要手动添加\0
    char oriarr3[5];
    strncpy(oriarr3,myName,2);
    oriarr3[2] ='\0';
    printf("n小于ct的长度:%s\n",oriarr3);
   
}

结果:

 二:mem系列

void *memchr(void *str, int c, size_t n)在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。若未出现字符则返回NULL
int memcmp(str1, str2, n)把str1和str2的前n个字节进行比较。

如果返回值 < 0,则表示 str1 小于 str2。

如果返回值 > 0,则表示 str1 大于 str2。

如果返回值 = 0,则表示 str1 等于 str2。

void *memcpy(dst, src, n)从src复制n个字节到dst,并返回dst的指针
void *memmove(dst, src, n)从src复制n个字节到dst,并返回dst的指针。重叠时也能正确复制
void *memset(str, c, n)复制字符c到参数str所指向的字符串的前n个字节

        个人在编码中mem系列的使用频次比str系列的高,利用mem系列的函数需要特别注意的是对最后一个传参n的保护,保证我们要操作的内存是绝对安全的,只对我们的目标内存进行操作。

三:两个系列的比较

1,memchr与strchr

memchr检测的是一段内存,strchr检查的是一个字符串;

strchr会停在\0但memchr不会;

memchr的效率也会更高;

2,memcmp与strcmp

功能比较:

二者都可以用于字符串的比较,但是二者是有比较大的差异的

strcmp是按照字节(byte-wise)比较的,并且比较的过程中会检查是否出现了"\0"结束符,一旦任意一个字符串指针前进过程中遇到结束符,将终止比较;

memcmp函数是用于比较两个内存块的内容是否相等,在用于字符串比较时通常用于测试字符串是否相等,不常进行byte-wise的字符串比较;

如果要比较的对象中包含一些由于边界对齐需求而填入结构对象中的空格、联合 (union)结束的额外空格、字符串所分配的空间未使用完的部分引起的“holes”的话,最好不能使用memcmp;

效率差异:

 strcmp比较的字符串,strcmp需要时刻检查是否遇到了字符串结束的 \0 字符

memcmp比较的是内存块,不需要检查是否有\0

所以memcmp的效率要高于strcmp

3,memcpy与strncpy

二者对内存重叠均没有保护,区别在于:

当拷贝的字节数小于等于src字符串长度时,二者是等价的;当拷贝的字节数大于src字符串的长度时,strncpy使用\0补齐字节数,memcpy会按照地址继续复制,会造成故障。

strncpy根据指定长度的字符串进行内容拷贝,遇到0时会终止;memcpy不终止。

4,memcpy和memmove

当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。

memmove与memcpy的区别(ABD)

A、内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确

B、当src内存区域和dest内存区域重叠时且dest所在区域在src所在区域前,memcpy可以正确拷贝

C、当src内存区域和dest内存区域重叠时且src所在区域在dest所在区域前,memcpy可以正确拷贝

D、对于BC,memmove都可以正确拷贝

memcpy和memmove的描述正确的是【仅考虑执行结果,不考虑规范性】C

A、源、目的地址有重叠时只能用memmove

B、源、目的地址无重叠时只能用memcpy

C、源、目的地址有重叠,且源>目的时,只能用memmove

D、源、目的地址有重叠,且源<目的时,只能用memmove

 

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

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

相关文章

TikTok推出PrivacyGo,品牌可与平台共享部分用户数据

1.TikTok宣布允许用户关闭内容自动显示功能 TikTok近日宣布修改运营方式&#xff0c;即允许用户关闭内容自动显示功能&#xff0c;以遵守将于8月底生效的欧盟新规定&#xff08;欧盟数字服务法案DSA&#xff09;&#xff0c;该法案对平台提出了新的要求&#xff0c;以更好地保…

Idea2023之热部署插件JRebel+XRebel激活及使用

使用的目的就是不用因为改动一点Java代码重复启动服务 JRable会自动检测代码变动重启服务,这也会变向增加计算机内存和性能消耗! 激活教程 1-生成guid guid 复制后下载exe文件 ReverseProxy_windows_amd64.exe 下载完毕后双击运行exe 初始只有第一行后面是激活过程中跑出…

Unity游戏源码分享-有意思的科普游戏3D-Electronic-Blocks-master

Unity游戏源码分享-有意思的科普游戏3D-Electronic-Blocks-master 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88190169

Spring Boot 简介与入门

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

软件性能测试有哪些测试指标?性能测试报告对软件产品起到的作用

在软件开发过程中&#xff0c;性能测试是一个至关重要的环节&#xff0c;主要关注软件系统在不同负载条件下的表现&#xff0c;以评估其稳定性、可扩展性和响应能力。它可以帮助开发人员评估软件系统的质量和性能。 一、软件性能测试的测试指标 性能测试的测试指标直接影响着…

2023年CRM系统十大排行榜

CRM作为数字化转型的重要载体&#xff0c;是企业必不可少的工具。市场上CRM品牌众多&#xff0c;企业很难选择哪个适合自己。2023年CRM软件十大品牌榜单&#xff0c;为您的选型提供参考。 1、Zoho CRM Zoho CRM是一款全球知名的SaaS CRM系统&#xff0c;为全行业客户提供CRM解…

PDM(产品数据管理)的重要性

PDM作为现代企业数字化转型的核心工具之一&#xff0c;在产品开发和管理领域具有极其重要的作用。PDM旨在有效地管理产品的所有数据&#xff0c;从设计阶段到制造和维护&#xff0c;以实现全生命周期的信息整合和协同。然而&#xff0c;PDM的实施和应用也面临着一系列挑战和复杂…

事件循环原理

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有…

leetcode1-两数之和

vector知识回顾 C基础——STL——Vector_52Tiramisu的博客-CSDN博客 自己写的初始代码 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int i 0, j 1;for(i 0; i < nums.size(); i){for(j 1; j < nums.size(); j){…

【MongoDB】索引

目录 一、概述 二、索引的类型 1、单字段索引 2、复合索引 3、其他索引 三、索引的管理 1、索引的创建 2、索引的查看 3、索引的删除 四、索引的使用 1、执行计划 2、涵盖的查询 一、概述 索引支持在MongoDB中高效地执行查询。如果没有索引&#xff0c;MongoDB必须…

【后端面经】微服务构架 (1-7) | 超时控制:精确拍准时钟,微服务架构的时间巧手!

文章目录 一、前置知识1、什么是超时控制?2、为什么要超时控制?3、超时控制的形态有哪些?4、如何确定超时时间?A) 根据用户体验B) 根据响应时间C) 压力测试D) 根据代码计算5、超时是否中断业务?6、监听超时时间二、面试环节1、面试准备2、基本思路3、亮点方案 ( 链路超时控…

刘汝佳の归并排序详解

思路 作为一种高效的排序算法&#xff0c;它主要是通过递归来实现的&#xff0c;具体步骤如下 划分问题&#xff1a;将序列划分成数量尽量相等的两部分递归求解&#xff1a;将两部分分别排序合并问题&#xff1a;将两个序列合并成一个 前两步对于笔者来说肯定是很容易实现的…

构建Docker容器监控系统(Cadvisor +InfluxDB+Grafana)

目录 案例概述 Cadvisor InfluxDBGrafana 1.1、 Cadvisor 1.2、InfluxDB 1.3、Grafana 1.4、监控组件架构 1.5、开始部署 安装docker-ce 阿里云镜像加速器 创建自定义网络 创建influxdb容器 案例概述 Docker作为目前十分出色的容器管理技术&#xff0c;得到大量企业…

ad+硬件每日学习十个知识点(25)23.8.5(常见芯片类型、数字隔离芯片、IO扩展芯片TCAL6416)

文章目录 1.常见的芯片类型2.数字隔离芯片有什么用&#xff1f;3.I2C的I/O扩展芯片说明4.16位I/O扩展芯片TCAL6416的features、applications、description5.TCAL6416的引脚功能6.TCAL6416的电气特性7.TCAL6416的典型特性&#xff08;图像&#xff09;8.TCAL6416的参数测量信息&…

C++职工管理系统(课程设计报告)

C职工管理系统 项目介绍设计任务设计要求 程序设计代码讲解实例输出 源码领取 项目介绍 项目介绍 该职工管理系统主要是用来管理整个公司的信息&#xff0c;基于C继承和多态来实现&#xff0c;同时也包含文件流操作。 设计任务 设计任务 (1)设计个职工管理系统&#xff0c;管理…

你知道音频文件格式转换要用什么软件吗?今天就来分享给你

你是否曾经遇到过这样的情况&#xff1f;你正在享受着一首心爱的歌曲&#xff0c;却突然发现它的音频格式不兼容你的设备或播放器&#xff1f;或者你需要将录音文件从一种格式转换成另一种&#xff0c;以便在不同场景中使用&#xff1f;音频格式转换软件就像是一个通向音乐自由…

流量、日志分析

流量分析 知识点&#xff1a; 流量包分析简介 - CTF Wiki (ctf-wiki.org) Wireshark 基本语法&#xff0c;基本使用方法&#xff0c;及包过虑规则_wireshark语法_竹痕的博客-CSDN博客 MISC&#xff1a;流量包取证&#xff08;pcap文件修复、协议分析、数据提取&#xff09;…

网络编程——数据包的组装和拆解

数据包的组装和拆解 一、数据包在各个层之间的传输 二、各个层的封包格式 1、链路层封包格式 -------------------------------------------------------------------------------------------------------------------------------------- | 目标MAC地址&#xff08;6字节&a…

Java实现电影信息查询系统

Java实现电影信息查询系统 需求分析代码实现小结Time 需求分析 首先每一部电影&#xff0c;都包含这部电影的相关信息&#xff0c;比如&#xff1a;电影的编号&#xff08;id&#xff09;、电影的名称&#xff08;name&#xff09;、电影的价格&#xff08;price&#xff09;、…

数据结构: 线性表(带头双向循环链表实现)

之前一章学习了单链表的相关操作, 但是单链表的限制却很多, 比如不能倒序扫描链表, 解决方法是在数据结构上附加一个域, 使它包含指向前一个单元的指针即可. 那么怎么定义数据结构呢? 首先我们先了解以下链表的分类 1. 链表的分类 链表的结构非常多样, 以下情况组合起来就有…