从零开始的c语言日记day40——字符函数和字符串函数——内存函数

  • 常用函数介绍

求字符串长度

strlen

·长度不受限制的字符串函数

Strcpy

Strcat

strcmp

长度受限制的字符串函数介绍

 strncpy

 strncat

strncmp

字符串查找

Strstro

 strtok

错误信息报告

strerror

字符操作

内存操作函数

memcpy

memmove

memset

Memcmp

使用Assert断言必须调用头文件<assert.h>

  • Strlen

字符串已经"\0'作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’)。

参数指向的字符串必须要以’\0’结束

注意函数的返回值为size_t,是无符号的(易错)

学会strlen函数的模拟实现

格式:size_t strlen ( const char* str))

注意不能直接用strlen相减这种写法如果减到负数,strlen返回结果是无符号整形,两个相减返回的值也是无符号整形,如果-3当成一个无符号整形他的补码存到内存里是一个很大的正数。

可以改为比较

用循环找到\0为止的方法计算字符个数

Assert(str):保证指针不能为空是有效的

  • Strcpy

格式:char* strcpy(char * destination,const char * source );

Destination:目的地

Source:源头

·源字符串必须以'\0’结束。

·会将源字符串中的'\0'拷贝到目标空间。

·目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变。

不能写成name=“zhangsan”因为name数组名是地址,地址是一个常量值不能被赋值

Strcpy拷贝到\0就停下来了自己加的\0也算

而且拷贝的东西必须包含\0,strcpy是找到\0才停止。

函数模拟实现

  • Strcat

格式:char * strcat ( char * destination,const char * source );

·源字符串必须以‘\0'结束。

·目标空间必须有足够的大,能容纳下源字符串的内容。

·目标空间必须可修改。

。空符串白己给白己追加.如何?

  1. 想要追加字符必须先找到被追加对象的结尾,也就是\0
  2. 自己不能给自己追加
  • Strcmp

比较两个数组相等

此程序无论两个数组内容是否一样,判断的结果都是不等于,因为比较的是地址。那使用strcmp函数如何做?

Strcmp比较的是数组\0的位置,第一个数组和第二个数组比较,谁先到\0因为\0的ascll码肯定比字符的小,所以就可以判断了。如果大于返回1小于返回-1等于返回0

自己写strcmp程序模拟

函数越界

Strcpy不看数组大小如果运行就会越界,这是函数设计时候的缺陷。vs软件提供自己的函数strcpy_s但是这个函数只有vs可以用。

程序之所以可以运行是因为开头定义了#define _CRT_SECURE_NO_WARNINGS 1

所以c语言提供了一种长度限制的版本函数

Strncpy

Strncat

Strncmp

多了一个num

只拷贝了5个字hello而f正好留下了

  • Strstr

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\

模拟函数实现

  • Strtok

格式:char * strtok ( char * str,const char * sep );


sep参数是个字符串,定义了用作分隔符的字符集合,把需要用的分隔符都放进去
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。

(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回NULL指针。

但是这样写的代码很死板,实际并不知道有多少个地方需要分割

初始化只需要一次,一次过后只需要看ret不等于空指针,循环一次之后再调用一次这次需要空指针不要传cp了(NULL,sep)

  • Strerror

返回的错误码

如果没有这个文件则会返回一个错误值:No such file or directory

文件正常打开才会没有报错

函数

如果他的参数符合下列条件就返回真

iscntrl

任何控制字符

isspace

空白字符:空格’’,换页’\f’,换行’\n',回车’\r’,制表符’\t’或者垂直制表符’\v’

isdigit

十进制数字0~9

isxdigit

十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F

islower

小写字母a~z

isupper

大写字母A~Z

isalpha

字母a~z或A~Z

isalnum

字母或者数字,a~z,A~Z,0~9

ispunct

标点符号,任何不属于数字或者字母的图形字符 (可打印)

isgraph

任何图形字符

isprint

任何可打印字符,包括图形字符和空白字符

判断是不是数字字符,是就返回非0值,如果不是返回0

  • Memcpy

内存拷贝

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

Memcpy(arr2,arr1,)

希望数据放到arr2,数据来自arr1,拷贝多少个整形7个就是28

用ret先储存arr2的首地址,因为执行玩之后arr2以及走到后面了。

而while的值就是具体想要cpy的值

循环第一行如果用(int*)我们只拷贝19个字节到后面会剩3个,所以用char一个一个来

memcpy函数是不用来处理重叠的内存之间的数据拷贝的

使用memmove函数来实现,重叠内存之间的数据拷贝

  • Memmove

C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

参数

str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。

n -- 要被复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

  • Memcmp

描述

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。

声明

下面是 memcpy() 函数的声明。

void *memcpy(void *str1, const void *str2, size_t n)

参数

str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。

n -- 要复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

一个一个比较,当到第二位的时候比较2和3,2小于3所以小于-1

  • Memset

描述

C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

声明

下面是 memset() 函数的声明。

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

参数

str -- 指向要填充的内存块。

c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。

n -- 要被设置为该值的字符数。

以上程序都没有问题,但以下这个程序有什么问题?

提供调试看到

Memset是把每一个字节都变成了1,因为这个函数是以字节位单位的,不能直接用整形

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

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

相关文章

点击el-tree小三角后去除点击后的高亮背景样式,el-tree样式修改

<div class"videoTree" v-loading"loadingTree" element-loading-text"加载中..." element-loading-spinner"el-icon-loading" element-loading-background"rgba(0, 0, 0, 0.8)" > <el-tree :default-expand-all&q…

鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期与页面中组件的生命周期(十六)

文章目录 一、应用生命周期二、生命周期函数定义三、生命周期五函数练习 一、应用生命周期 1、定义 应用生命周期就是代表了一个HarmonyOS应用中所有页面从创建、开启到销毁等过程的全生命周期。查看路径如下&#xff1a; Project/entry/src/main/ets/entryability/EntryAbili…

17、XSS——session攻击

文章目录 一、session攻击简介二、主要攻击方式2.1 预测2.2 会话劫持2.3 会话固定 一、session攻击简介 session对于web应用是最重要&#xff0c;也是最复杂的。对于web应用程序来说&#xff0c;加强安全性的首要原则就是&#xff1a;不要信任来自客户端的数据&#xff0c;一定…

Spring Boot与Mybatis基础配置(手动写增删改查)

一、 配置 1.新建项目 1.项目基础配置 解释&#xff1a;记得把这个改成start.aliyun.com要不没有java8也就是jdk1.8 2.项目依赖配置 2.配置maven 配置前&#xff1a; 配置后&#xff1a; 3.创建子项目并配置父子项目pom.xml 配置父pom.xml 声明当前项目不是要打成jar包的…

NFC和蓝牙在物联网中有什么意义?如何选择?

#NFC物联网# #蓝牙物联网# 在物联网中&#xff0c;NFC和蓝牙有什么意义&#xff1f; NFC在物联网中代表近场通信技术。它是一种短距离、高频的无线通信技术&#xff0c;可以在近距离内实现设备间的数据传输和识别。NFC技术主要用于移动支付、电子票务、门禁、移动身份识别、防…

利用阿里云 DDoS、WAF、CDN 和云防火墙为在线业务赋能

在这篇博客中&#xff0c;我们将详细讨论使用阿里云 CDN 和安全产品保护您的在线业务所需的步骤。 方案描述 创新技术的快速发展为世界各地的在线业务带来了新的机遇。今天的人们不仅习惯了&#xff0c;而且依靠互联网来开展他们的日常生活&#xff0c;包括购物、玩游戏、看电…

【python VS vba】(7) python与numpy (建设ing)

目录 1 numpy 的基本介绍 2 numpy里的两种新数据类型&#xff1a;ndarray 和 matrix 2.1 numpy特殊的数据类型 2.1.1 python的数据类型 2.1.2 首先 python原生的list 和 tuple 2.1.3 numpy的数据类型 2.2 np.matrix() 或者 np.mat() 2.2.1 首先&#xff0c;两种写法相…

基于PicGo实现Typora图片自动上传GitHub

文章目录 一. 引言二. 原理三. 配置3.1 GitHub 设置3.2 下载配置 PicGo3.3 配置 Typora3.4 使用 一. 引言 Typora是一款非常好的笔记软件&#xff0c;但是有一个比较不好的地方&#xff1a;默认图片是存放在本地缓存中。这就会导致文件夹一旦被误删或电脑系统重装而忘记备份文件…

18、XSS——cookie安全

文章目录 1、cookie重要字段2、子域cookie机制3、路径cookie机制4、HttpOnly Cookie机制5、Secure Cookie机制6、本地cookie与内存cookie7、本地存储方式 一般来说&#xff0c;同域内浏览器中发出的任何一个请求都会带上cookie&#xff0c;无论请求什么资源&#xff0c;请求时&…

西南科技大学C++程序设计实验六( 继承与派生一)

一、实验目的 1. 理解不同继承属性对派生类访问基类成员的区别 2. 掌握单继承程序编写 二、实验任务 1、调试下列程序,并在对程序进行修改后再调试,指出调试中的出错原因(该题中A为基类,B为派生类,B以public方式继承A) 重点:理解不同继承方式数据的访问权限,派生类…

.kann勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 在数字化的今天&#xff0c;.kann勒索病毒等数字威胁正日益猖狂&#xff0c;给个人和企业的数据安全带来了巨大威胁。本文将深入介绍.kann勒索病毒的特征&#xff0c;提供有效的数据恢复方法&#xff0c;并分享一些预防措施&#xff0c;助您更好地在数字世界…

Java利用TCP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为聊天。然后创建包&#xff0c;创建两个类&#xff0c;客户端&#xff08;SocketClient&#xff09;和服务器端&#xff08;SocketServer&#xff09; 二、实现代码 客户端代码&#xff1a; package 聊天; import ja…

Memory-augmented Deep Autoencoder for Unsupervised Anomaly Detection 论文阅读

Memorizing Normality to Detect Anomaly: Memory-augmented Deep Autoencoder for Unsupervised Anomaly Detection 摘要1.介绍2.相关工作异常检测Memory networks 3. Memory-augmented Autoencoder3.1概述3.2. Encoder and Decoder3.3. Memory Module with Attention-based S…

mysql知识分享(包含安装卸载)(一)

如果博客有错误&#xff0c;请佬指正。 目录 注意&#xff1a;打开cmd时要有管理员身份打开&#xff0c;重要 为何使用数据库&#xff1f; 数据库的相关概念 关系型数据库 关系型数据库设计规则 表&#xff0c;记录&#xff0c;字段 表的关联关系 一对一关联 一对多关系 …

西南科技大学C++程序设计实验七(继承与派生二)

一、实验目的 1. 掌握多继承程序设计 2. 掌握虚基类编程 3. 拓展学习可视化程序设计中的继承与派生应用 二、实验任务 重点:掌握虚基类的定义与实现,拓展其功能。 阅读分析、完善程序。下面程序(1)与程序(2)分别是没有使用虚基类和使用虚基类的代码,其中A是最上层基…

【二分答案法】寻找峰值

题目&#xff1a;162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 题目分析&#xff1a; &#xff08;1&#xff09;据题知&#xff0c;索引-1、索引n&#xff08;n为数组长度&#xff09;处的元素都默认为无穷小&#xff0c;我们可以在一开始特判…

SLAM算法与工程实践——SLAM基本库的安装与使用(2):OpenCV库

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

RabbitMQ创建新用户,并给用户添加角色和授权

一、进入容器 1.1 查看运行容器的详细信息 docker ps -a1.2 进入容器命令 docker exec -it 容器ID /bin/bash 或 docker exec -it 容器name bash 1.3 退出容器命令 exit 或者 CtrlQP 二、操作RabbitMQ 2.1 查看用户列表 注:先进入到容器内部 rabbitmqctl list_user…

SQL语言重温

数据库语言重温 笔记背景SQL教程一些最重要的 SQL 命令SQL WHERE 子句SQL AND & OR 运算符SQL ORDER BY 关键字 笔记背景 由于工作需要&#xff0c;现重温简单SQL语言&#xff0c;笔记记录如下。 SQL教程 SQL&#xff08;Structured Query Language:结构化查询语言&…

【PyTorch】权重衰减

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现 1. 理论介绍 通过对模型过拟合的思考&#xff0c;人们希望能通过某种工具调整模型复杂度&#xff0c;使其达到一个合适的平衡位置。权重衰减&#xff08;又称 L 2 L_2 L2​正则化&#xff09;通过为损失函数添加惩…