C语言_字符串+内存函数的介绍

字符函数和字符串函数

本章重点

重点介绍处理字符和字符串的库函数的使用和注意事项

  • 求字符串长度
    • strlen
  • 长度不受限制的字符串函数
    • strcpy
    • strcat
    • strcmp
  • 字符串查找
    • strstr
    • strtok
  • 错误信息报告
    • strerror
  • 字符操作
  • 内存操作函数
    • memcpy
    • memmove
    • memset
    • memcmp

1. 字符函数介绍

1.1 strlen

size_t strlen ( const char * str );

  • 字符串已经\0作为结束标志,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0)。
  • 参数指向的字符串必须要以\0结束。
  • 注意函数的返回值为size_t,是无符号的(易错)
  • 学会strlen函数的模拟实现

在我们模拟实现strlen之前,先要会用strlen函数,以下案例是正确的嘛?

在这里插入图片描述

输出结果:

在这里插入图片描述

很多人就好奇为什么3 - 6 > 0。
因为strlen返回类型是size_t,是以无符号类型进行返回的,那么无符号 - 无符号 得到的答案肯定也就是无符号类型了。
值确实是-3,但是在内存中存储,因为是负数,需要转换为补码,补码可是一个很大的数字,然后又要以无符号类型进行输出,得到的答案就是>0

模拟实现strlen函数

在这里插入图片描述

1.2 strcpy

char* strcpy(char * destination, const char * source );

  • 源字符串必须以\0结束。
  • 会将源字符串中的\0拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。
  • 学会模拟实现。

使用库函数strcpy看看效果

在这里插入图片描述

模拟实现strcpy

在这里插入图片描述

1.3 strcat

char * strcat ( char * destination, const char * source );

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

先来看看库函数strcat的使用
在这里插入图片描述

模拟实现库函数strcat

在这里插入图片描述

那么自己追加自己是否成立呢?

在这里插入图片描述

画图详解

在这里插入图片描述

1.4 strcmp

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

  • 标准规定:
    • 第一个字符串大于第二个字符串,则返回大于0的数字
    • 第一个字符串等于第二个字符串,则返回0
    • 第一个字符串小于第二个字符串,则返回小于0的数字
  • 那么如何判断两个字符串?

先来看看库函数xtrcmp的使用

在这里插入图片描述

模拟实现库函数strcmp

在这里插入图片描述

1.5 strncpy

char * strncpy ( char * destination, const char * source, size_t num );

  • 拷贝num个字符从源字符串到目标空间。

  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

在这里插入图片描述

1.6 strncat

char * strncat ( char * destination, const char * source, size_t num );

  • 将源的前Num个字符追加到目标,外加一个终止NUL字符。
  • 如果SOURCE中的C字符串的长度小于Num,则只包含到终止NUL的内容,字符被复制。

在这里插入图片描述

1.7 strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

  • 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

在这里插入图片描述

1.8 strstr

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

  • 返回指向str1中str2的第一个匹配项的指针,如果str2不是str1的一部分,则返回空指针。

在这里插入图片描述

模拟实现strstr库函数

在这里插入图片描述
输出结果:

在这里插入图片描述

1.9 strtok

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

  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL 指针。

在这里插入图片描述

1.10 strerror

char * strerror ( int errnum );

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

在这里插入图片描述

2. 内存函数

2.1 memcpy

void * memcpy ( void * destination, const void * source, size_t num );

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到\0的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。

在这里插入图片描述

模拟实现库函数memcpy

在这里插入图片描述

输出结果:

在这里插入图片描述

当我们想要自己拷贝自己的时候,从3的位置开始拷贝1开始的位置,拷贝20个字节,能实现1 2 1 2 3 4 5 8 9 10嘛?

在这里插入图片描述

总结:memcpy是用来处理不重叠的内存空间拷贝。
这里就延续出了memmove库函数的用法

2.2 memmove

void * memmove ( void * destination, const void * source, size_t num );

  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

成功使用库函数memmove实现重叠的内存空间拷贝

在这里插入图片描述

当我们想要模拟实现库函数memmove的时候会遇到以下几个问题

在这里插入图片描述

下面来实现代码:

在这里插入图片描述

输出两种类型结果:

第一种:dest < src

在这里插入图片描述

第二种: dest> src

在这里插入图片描述

2.3 memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

  • 比较从ptr1和ptr2指针开始的num个字节

在这里插入图片描述

在内存中可以观察到直到第九个字节比对都是一模一样的,所以ret接收了一个0。

2.4 memset

void *memset(void *str, int c, size_t n);

  • str – 指向要填充的内存区域的指针。
  • c – 要设置的值,通常是一个无符号字符。
  • n – 要被设置为该值的字节数。

在这里插入图片描述

总结:本章主要讲解了一些字符串函数以及内存函数的使用方法,极个别的实现了手搓库函数,让我们了解到了函数底层的运行原理。

本章完~

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

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

相关文章

Linux:线程

我恨死大物实验、模电实验、嵌入式实验、概率论和满实验室飞的蚊子了&#xff01;&#xff01;&#xff01; 前言&#xff1a; OS进行内存管理&#xff0c;是以内存块为单位管理的&#xff0c;一个块默认是4kb,一个块里有八个扇区 查看当前系统下的块的大小&#xff1a; ge…

MOE论文详解(3)-Switch Transformers

Switch Transformers也是google在2022年发表的一篇论文, 该论文简化了MoE的路由算法, 减少了计算量和通信量; 第一次支持bfloat16精度进行训练. 基于T5-Base和T5-Large设计的模型在相同的算力下训练速度提升了7x倍; 同时发布了1.6万亿(1.6 trillion)参数的MoE模型&#xff0c;相…

【Next.js 项目实战系列】03-查看 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】02-创建 Issue 查看 Issue 展示 Issue​ 本节代码链接 首先使用 prisma 获取所有…

【QT】常用控件(二)

个人主页~ 常用控件&#xff08;一&#xff09;~ 常用控件 三、按钮类控件1、Push Buttonwidget.hwidget.cpp 2、Radio Button3、Check Box 四、显示类控件1、label 三、按钮类控件 1、Push Button QPushButton继承自QAbstractButton&#xff0c;它是所有按钮的父类 我们从…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP&#xff0b;MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密&#xff0c;其他开源可二开 演示源码下载 开…

Zookeeper快速入门:部署服务、基本概念与操作

文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载&#xff1a; 一定要下载编译后的文件&#xff0c;后缀为bin.tar.gz w…

如何匿名浏览网站,保护在线隐私?

在现如今的网络世界&#xff0c;在线隐私已不复存在。你总是被跟踪&#xff0c;即使你使用隐身模式也无济于事。隐身模式会阻止浏览器保存你的浏览历史记录。但它并不能阻止你的互联网服务提供商 (ISP)、雇主、学校、图书馆或你访问的网站看到你在网上做什么。 更有不法分子在未…

CVE-2015-4852 Weblogic T3 反序列化分析

0x01 前言 看到很多师傅的面经里面都有提到 Weblogic 这一个漏洞&#xff0c;最近正好有一些闲暇时间&#xff0c;可以看一看。 因为环境上总是有一些小问题&#xff0c;所以会在本地和云服务器切换着调试0x02 环境搭建 • 太坑了&#xff0c;我的建议是用本地搭建的方法&…

【C语言】一维数组应用Fibonacci数列

Fibonacci数&#xff08;斐波那契数列&#xff09; 前两项为1&#xff0c;从第三项开始&#xff0c;每一项为前两项的和。可以知道连续三项的关系&#xff1a;f[i]f[i-1]f[i-2] 使用数组进行存储&#xff0c;十分方便。可以知道前n项的fibonacci数。 #include <stdio.h>…

ios局域网访问主机Xcode配置

前景&#xff1a; 公司业务是做智能家居&#xff0c;所有设备通过主机控制&#xff0c;目前有个产品需求是&#xff0c;在没有外网的情况下依然能够通过局域网控制主机的设备。 IOS开发需要做的&#xff1a; 除了业务代码之外&#xff0c;前提还要配置访问局域网功能。有以下…

诺贝尔经济学奖历史名单数据集(1969-2024年)

2024年诺贝尔经济学奖授予了达龙阿西莫格鲁&#xff08;Daron Acemoglu&#xff09;、西蒙约翰逊&#xff08;Simon Johnson&#xff09;和詹姆斯A罗宾逊&#xff08;James A. Robinson&#xff09;&#xff0c;以表彰他们在理解制度如何影响经济发展方面的贡献。&#xff08;“…

Linux 外设驱动 应用 3 串口

3 串口 3.1 串口原理 串行口是计算机一种常用的接口&#xff0c;具有连接线少&#xff0c;通讯简单&#xff0c;得到广泛的使用。常用的串口是 RS- 232-C接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同…

Input-Source-Pro:自动切换输入法并提示状态

Input Source Pro 是一款 macOS 上的输入法辅助工具&#xff0c;它可以根据不同应用、不同网站来自动切换输入法&#xff0c;并可以在鼠标周围显示当前输入法状态。 macOS 不像 Windows 那样能保存输入法状态&#xff0c;因此这样的软件还是挺有用的。 ‍ 介绍 官网&#x…

OceanBase中扩容OCP节点step by step

许多用户在开始使用OceanBase时部署OCP&#xff0c;通常选择单节点部署。但随着后续业务规模的不断扩大&#xff0c;会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此&#xff0c;会将现有的单节点OCP扩展至多节点部署&#xff0c;以此来确保OCP服务的高…

『Mysql集群』Mysql高可用集群之读写分离(二)

前言 主从复制: 解决了Mysql的单点故障问题以及提高MySQL的整体服务性能. 读写分离: 解决的是数据库的读性能问题,分担主库的压力&#xff0c;提高系统的可用性和稳定性。 分库分表: 数据库分表可以解决单表海量数据的查询性能问题&#xff0c;分库可以解决单台数据库的并发…

计算机网络——应用层(DNS域名系统、文件传输协议FTP、远程终端协议TELNET、万维网)

应用层概述 不同网络应用的应用进程之间&#xff0c;还需要用不同的通信规则。因此在运输层协议之上&#xff0c;还需要有应用层协议。 每个应用层协议都是为了解决某一类应用问题&#xff0c;而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成。…

网络七层架构

目录标题 网络七层架构从正确认识网络七层架构开始 网络七层架构 简介&#xff1a; 网络七层架构是指ISO/OSI模型&#xff0c;它是国际标准化组织&#xff08;ISO&#xff09;制定的一种用于计算机网络体系结构的参考模型。该模型将计算机网络的功能划分为七个层次&#xff0c…

Spring Boot知识管理:跨平台集成方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【UML】一个UML学习的还不错的几个帖子

https://segmentfault.com/a/1190000042775634 寂然解读设计模式 - UML类图&类的六大关系-阿里云开发者社区

信息抽取数据集处理——RAMS

引言 RAMS数据集&#xff08;RAMS&#xff1a;Richly Annotated Multilingual Schema-guided Event Structure&#xff09;由约翰斯霍普金斯大学于2020年发布&#xff0c;是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件&#xff0c;涵盖了139种不同的事件类型和65种…