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

news2024/11/27 20:54:00
  • 常用函数介绍

求字符串长度

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.coloradmin.cn/o/1291324.html

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

相关文章

Mendix版的电商京东首页长什么样儿?

前言 世界需要大前端。大前端需要Mendix。 近日经常有企业IT侧的朋友反应&#xff0c;自家需要一个神奇的内容管理平台&#xff0c;来快速打造随需应变的公司官网&#xff0c;亦或企业官微&#xff0c;如果能在小程序里呈现产品营销类的功能更好。首先要肯定的是&#xff0c;…

nodejs+vue+微信小程序+python+PHP的Sd球鞋销售平台的设计与实现-计算机毕业设计推荐

此网站系统的开发方式和信息管理方式&#xff0c;借鉴前人设计的信息和研发。以网站商品信息为主&#xff0c;购物商品为核心功能来进行设计和研发&#xff0c;把网站信息和技术整合&#xff0c;开发出一套Sd球鞋销售平台。用目前现有的新技术进行系统开发&#xff0c;   目…

linux云服务器开启防火墙注意事件

重要的事情先说三遍: linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! 也就是能打开这个页面: 为什么这么说呢?如果你…

这个蓄电池监测技术,超硬核!

随着科技的飞速发展&#xff0c;蓄电池作为一种重要的能量储存装置&#xff0c;已经深刻地影响着我们的日常生活和各个行业。 因此&#xff0c;为了确保蓄电池系统的可靠性、安全性和效率&#xff0c;监控技术的应用变得尤为迫切。 客户案例 工业备用电源 在工业领域&#x…

Spring Boot 实战 | Spring Boot整合JPA常见问题解决方案

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

中庸行者 - 华为机试真题题解

给定一个m * n的整数矩阵作为地图,短阵数值为地形高度; 中庸行者选择地图中的任意一点作为起点,尝试往上、下、左、右四个相邻格子移动; 移动时有如下约束: 中庸行者只能上坡或者下坡,不能走到高度相同的点不允许连续上坡或者连续下坡,需要交替进行,每个位置只能经过一次…

【Ajax】发送get请求获取接口数据

编写html实现通过Ajax发送get请求并获取数据 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

冯·诺依曼的绝密程序,让世界上多了一个高薪职业!

1 一次偶遇 1944年春天&#xff0c;戈德斯坦上校在阿伯丁火车站台上偶遇大神冯诺依曼。 戈德斯坦壮起胆子&#xff0c;拘谨地和冯诺依曼聊起来。 幸运的是&#xff0c;冯诺依曼热情而友善&#xff0c;让戈德斯坦很放松。 当冯诺依曼得知戈德斯坦正在宾夕法尼亚大学研制电子计算…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion简介

Stable Diffusion是2022年发布的深度学习文本到图像生成模型,它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如

微信会员卡小程序 多门店系统 满足日常商家的收银功能 附带完整的搭建教程

大家好&#xff0c;今天罗峰来给大家分享一款微信会员卡小程序源码系统&#xff0c;多门店系统&#xff0c;附带完整的搭建教程。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.多门店管理&#xff1a;系统支持添加多个门店&#xff0c;每个门店可独立管理…

自动化定时发送天气提醒邮件

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;如喜欢麻烦您点个&#x1f44d;或者点个⭐&#xff01; &#x1f…

Redis和MySQL双写一致性实用解析

1、背景 先阐明一下Mysql和Redis的关系&#xff1a;Mysql是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致&#xff08;即缓存一致性问题…

C#excel导入dategridview并保存到数据库/dategridview增加一行或几行一键保存数据库

excel导入到dategridview显示并保存到数据库 dategridview增加一行或几行一键保存数据库 ExcelHelper类(这个要导入NPOI包) using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using Syste…

nginx编译安装及配置文件的修改

目录 编译安装nginx root和alias 升级 nginx访问状态统计配置 基于授权的的访问控制 基于客户端的访问控制 编译安装nginx 1.关闭防火墙&#xff0c;安全机制&#xff0c;去官网下载nginx压缩包&#xff0c;并进行解压 systemctl stop firewalld #关闭防火墙 systemctl…

Linux指令学习

目录 1.ls指令 2.pwd命令 3.cd 指令 4. touch指令 5.mkdir指令 6.rmdir指令 && rm 指令 7.man指令 8.cp指令 9.mv指令 10.cat指令 11.more指令 12.less指令 13.head指令 14.find指令&#xff1a; -name 15.grep指令 16.zip/unzip指令&#xff1a; 17.tar…

创建vue项目:node.js下载安装、配置环境变量,下载安装cnpm,配置npm的目录、镜像,安装vue、搭建vue项目开发环境(保姆级教程一)

今天讲解 Windows 如何创建 vue 项目&#xff0c;搭建 vue 开发环境&#xff0c;这是这个系列的第一章&#xff0c;有什么问题请留言&#xff0c;请点赞收藏&#xff01;&#xff01;&#xff01; 文章目录 一、Vue简单介绍二、开始搭建1、安装node.js环境2、配置npm下载时的默…

Vue 创建组件

组件&#xff1a;用于将某个功能的 HTML、CSS、JS 封装到一个文件中&#xff0c;提高代码的复用性和可维护 性。 基础使用【setup 语法糖写法】 一、在 src / components 文件夹中创建一个组件&#xff0c;文件命名为 MyDemo 。 <template><p class"redColo…

Domino多Web站点托管

大家好&#xff0c;才是真的好。 看到一篇文档&#xff0c;大概讲述的是他在家里架了一台Domino服务器&#xff0c;上面跑了好几个Internet的Web网站&#xff08;使用Internet站点&#xff09;。再租了一台云服务器&#xff0c;上面安装Nginx做了反向代理&#xff0c;代理访问…

vue2-使用vue-i18n搭建多语言切换环境

安装 注意&#xff1a;vue2.0要用8版本的&#xff0c;使用9版本的会报错 npm install vue-i18n8.27.0 --save 创建相关的语言包文件 在src目录下&#xff0c;新建i18n文件夹 在新文件夹i18n中新建langs文件夹&#xff0c;里边放语言文本文件.js zh.js&#xff1a;存…

抽象类和接口(超重点!!)

[本节目标] 1.抽象类 2.接口 3.Object类 1.抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&a…