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

        在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 herechar *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 herechar *myName = "ftz";//strncpy(s, ct, n) normalchar 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的长度  需要手动添加\0char 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.rhkb.cn/news/81364.html

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

相关文章

使用线性回归预测票房收入 -- 机器学习项目基础篇(10)

当一部电影被制作时&#xff0c;导演当然希望最大化他/她的电影的收入。但是我们能通过它的类型或预算信息来预测一部电影的收入会是多少吗&#xff1f;这正是我们将在本文中学习的内容&#xff0c;我们将学习如何实现一种机器学习算法&#xff0c;该算法可以通过使用电影的类型…

机器视觉赛道持续火热,深眸科技坚持工业AI视觉切入更多应用领域

随着深度学习等算法的突破、算力的不断提升以及海量数据的持续积累&#xff0c;人工智能逐渐从学术界向工业界落地。而机器视觉作为人工智能领域中一个正在快速发展的分支&#xff0c;广泛应用于工业制造的识别、检测、测量、定位等场景&#xff0c;相较于人眼&#xff0c;在精…

揭秘bi数据分析系统:如何轻松掌握商业智能的秘密

在大数据时代的背景下&#xff0c;企业开始越来越重视数据分析的重要性。bi数据分析系统不仅可以帮助企业感知市场变化趋势&#xff0c;还可以实时监测并评估企业经营决策的效果&#xff0c;支持企业的持续发展。在国内&#xff0c;国产数据处理工具如瓴羊Quick BI等崛起&#…

自动化实践-全量Json对比在技改需求提效实践

1 背景 随着自动化测试左移实践深入&#xff0c;越来越多不同类型的需求开始用自动化测试左移来实践&#xff0c;在实践的过程中也有了新的提效诉求&#xff0c;比如技改类的服务拆分项目或者BC流量拆分的项目&#xff0c;在实践过程中&#xff0c;这类需求会期望不同染色环境…

检验代码生成器完成版

写维护页面重复逻辑写烦了&#xff0c;连页面的增、删、改、查、弹窗等代码都不行手写了&#xff0c;为此做成代码生成器成型版1.0.干到10点。。。 代码&#xff1a; Class Demo.CodeGener Extends %RegisteredObject {/// 生成操作表相关的代码&#xff0c;包括M、C#调用代码…

【go-zero】docker镜像直接部署go-zero的API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…

迭代器模式(C++)

定义 提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露(稳定)该对象的内部表示。 应用场景 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望在不暴露其内部结构的同时&#xff0c;可以让外部客户代…

BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

在Android系统中&#xff0c;进程间通信&#xff08;IPC&#xff09;是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信&#xff0c;而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理&#xff0c;并…

JMeter处理接口签名之BeanShell实现MD5加密

项目A需要给项目B提供一个接口&#xff0c;这个接口加密了&#xff0c;现在需要测试这个接口&#xff0c;需要怎么编写脚本呢&#xff1f;实现接口签名的方式有两种&#xff1a;BeanShell实现MD5加密和函数助手实现MD5加密&#xff0c;之前已经分享过了函数助手实现MD5加密&…

[Linux]计算机软硬体系结构

[Linux]计算机软硬体系结构 文章目录 [Linux]计算机软硬体系结构冯诺依曼体系结构冯诺依曼体系结构的组成冯诺依曼体系结构中各部件的功能对存储器(内存)的理解对数据流的理解 了解操作系统操作系统的概念管理的概念管理的本质管理的精髓“先描述&#xff0c;再组织”计算机软硬…

SpringCloud之微服务API网关Gateway介绍

文章目录 1 微服务API网关Gateway1.1 网关1.1.1 简介1.1.2 相比于Zuul 1.2 Spring Cloud Gateway介绍1.3 Gateway特性1.4 Gateway工作流程1.5 Gateway核心概念1.5.1 路由1.5.1.1 定义1.4.1.2 动态路由 1.4.2 断言1.4.2.1 默认断言1.4.2.2 自定义Predicate 1.4.3 过滤器1.4.3.1 …

Llama 2 云端部署与API调用【AWS SageMaker】

Meta 刚刚发布了 Llama 2 大模型。如果你和我们一样&#xff0c;你一定会迫不及待地想要亲自动手并用它来构建。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 使用任何类型的 LLM 进行构建的第一步是将其托管在某处并通过 API 使用它。 然后你的开发人员可以轻松地将…

决策树和随机森林对比

1.用accuracy来对比 # -*-coding:utf-8-*-""" accuracy来对比决策树和随机森林 """ from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine#(178, 13…

【Spring】使用注解存储Bean对象

目录 一、配置扫描路径&#xff08;使用注解的方式存对象的前提&#xff09; 二、使用类注解存储Bean对象 1、使用五大类注解存储Bean对象 2、为什么要这么多的类注解&#xff1f; 2.1、五大类注解之间的关系 3、获取Bean对象时的默认命名规则 三、使用方法注解来存储…

2023年新手如何学剪辑视频 想学视频剪辑如何入门

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。接下来&#xff0c;一起来看看新手如何学剪…

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式

近日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛&#xff0c;并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…

VAE、 EM、KL散度

文章目录 VAEVAE额外的损失函数 EMKL散度 VAE 左图相当于变量x&#xff0c;右图相当于z 假如在AE中&#xff0c;一张满月的图片作为输入&#xff0c;模型得到的输出是一张满月的图片&#xff1b;一张弦月的图片作为输入&#xff0c;模型得到的是一张弦月的图片。当从满月的code…

瞅一眼nginx

目录 &#x1f9ac;什么是nginx? &#x1f9ac;nginx配置官方yum源&#xff1a; &#x1f9ac;nginx优点 &#x1f9ac;nginx 缺点 &#x1f9ac;查看nginx默认模块 &#x1f40c;nginx新版本的配置文件&#xff1a; &#x1f40c;nginx目录索引 &#x1f40c;nginx状态…

网络编程(JavaEE初阶系列10)

目录 前言&#xff1a; 1.网络编程的基础 1.1为什么需要网络编程 1.2什么是网络编程 1.3网络编程中的基本概念 1.3.1发送端和接收端 1.3.2请求和响应 1.3.3客户端和服务端 2.Socket套接字 2.1概念 2.2分类 3.UDP数据报套接字编程 3.1DataGramSocket API 3.2Datagr…

【游戏客户端】制作你玩我猜Like玩法

【游戏客户端】制作你玩我猜Like玩法 大家好&#xff0c;我是Lampard猿奋~~ “你画我猜”相信大家都不陌生&#xff0c;当初这款小游戏可谓茶余饭后必玩之选&#xff0c;风头一时无二。今天要和大家分享如何实现一个你玩我猜Like的玩法。 我们可以简单的把需求拆成两个个部分&…