当前位置: 首页 > news >正文

C语言字符串缺陷

目录

 

补缺:

正题开始:

思考:

解决方案:

1.string类

2.redis库

简介:

对于处理字符串的好处:

下期预告:内容待定


 

补缺:

在上期内容的结尾我留下了一个问题,这个问题是让大家思考八位二进制的最大值和最小值以及它们之间的关系。相信大家都有了自己的一个思考,现在解析开始。算是补码的一个小奇葩。

首先这个问题我们要先想到在八位二进制中最大值是多少(补码中),最大值是127(0111 1111)。第二个要想一想在补码中的规则(在补码中首位是符号位,不参与计算),所以最大值的表达就是剩下的七位是1,首位是0代表最大的有符号数。然后我们再思考,在补码中负数是由正数的二进制取反加一来表达的,所以我们只要找到正数最大数然后取反就可以了?由于补码中八位二进制的最大数127,那么我们应该取反加一就行了吗?不不不,在这里C语言中用到了一个巧妙地方法(与之前的方法不同)。C语言在八位二进制数的最大值127(0111 1111)后面直接加一从而得到(1000 0000)也就是-128。这里的方法和补码的规则不太一样,这种方法只是在补码中对于由最大的二进制数转换到最小的二进制数的过程,其他的转换还是补码的规则(保留首位,取反加一)。我们加上一之后满足二进制的规则(逢二进一),我们就会得到(1000 0000)这个数,而这恰恰满足补码中对于有符号数的表达(首位的1恰好看作是符号位),所以这就是补码中关于最大数转换成为最小数的过程(循环)中的一个方法,整数溢出导致的二进制数循环的最特殊的一步。

总结:补码中对于最大数到最小数的转换的规则就是找到最大数的二进制表达方式,然后加一得到的二进制数就是最小数的表达。至于为什么说这是循环可以看看我上一篇的内容C语言整数溢出的问题              提升补充内容——补码


正题开始:

首先我们要清楚字符串其实就是字符数组,所以字符数组的结尾也是有\0存在的。而且在C语言中通过字符数组的指针(首地址)和字符数组的结束符来控制字符数组。

#include<iostream>
using namespace std;
int main()
{
char z1[]="hello"
cout<<strlen(z1)<<endl;//5
cout<<sizeof(z1)/sizeof(z1[0]);//6char z2[]="hel\0lo"
cout<<strlen(z2)<<endl;//3
cout<<sizeof(z2)/sizeof(z2[0]);//4char z3[30]="hello2";
strcat(z3[],z2[]);
cout<<z3<<endl;//hellohel
cout<<strlen(z3)<<endl;//8
cout<<sizeof(z3)/sizeof(z3[0]);//9
}

上面的代码我们定义了三个个字符数组.我们都知道\0就是字符串的结束符,所以我们第一个数组输出的结果就是5和6。(这里的strlen就是数组的内容长度;sizeof算的是数组的存储长度,是包括\0的)。那么看z2这里由于hello中插入了一个\0所以hello的长度就被提前结束了所以内容长度只有3,但是它的存储长度却是因为多了一个\0,所以变成了8。接下来看z3,这个数组我们利用strcat来将两个数组进行拼接,结果是:内容长度是8,存储长度是9。(拼接的时候第一个数组的结束符会被删除,只保留第二个数组的结束符,相当于拼接后的字符数组只有一个结束符)。


思考:

那么你发现了什么。所有的字符数组都是和\0有直接的关系的,不论是内容长度还是存储的空间长度都是相关的。所以这就导致我们存储的内容是不能包含\0的而且这种检测存储长度的方法(sizeof)也会变得很慢,效率不高。


解决方案:

有两种:1 string类    2  redis库

1.string类

#include<iostream>
using namespace std;
#include<string>
int main()
{
char z1[]="hello"
cout<<strlen(z1)<<endl;//5
cout<<sizeof(z1)/sizeof(z1[0]);//6char z2[]="hel\0lo"
cout<<strlen(z2)<<endl;//3
cout<<sizeof(z2)/sizeof(z2[0]);//4char z3[30]="hello2";
strcat(z3[],z2[]);
cout<<z3<<endl;//hellohel
cout<<strlen(z3)<<endl;//8
cout<<sizeof(z3)/sizeof(z3[0]);//9//C++的改进方案:string zz1="hello";
cout<<zz1.length()<<endl;//5
cout<<zz1.capacity()<<endl;//15
cout<<sizeof(zz1)<<endl;//28string zz2="hel\0lo";
cout<<zz2.length()<<endl;//3
cout<<zz2.capacity()<<endl;//15
cout<<sizeof(zz2)<<endl;//28zz1+=zz2;
cout<<zz1.length()<<endl;//8
cout<<zz1.capacity()<<endl;//15
cout<<sizeof(zz1)<<endl;//28}

我们看上面的代码是用C++的方案写出的。我们可以看出关于内容长度上C++的length还是3;其中的capacity是预存空间(随着编译器的变化而变化);但是看sizeof这个时候的存储空间就是整个string的存储空间,不再单独是字符串的存储空间。而且string类的内容很多,也跟利于字符串的使用,这就是C++的升级。


2.redis库

简介:

Redis 是一个开源的、使用 ANSI  C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value)可以是字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、位图(bitmaps)、超日志(hyperloglogs)和地理空间(geospatial)索引半径查询的索引等类型。


对于处理字符串的好处:

1.性能高效:Redis是基于内存的数据库,所以存取字符串的速度非常快,非常适合处理高频次的数据读写操作。
2.灵活的数据类型:虽然叫做字符串,但Redis的字符串实际上可以存储任何形式的字符串,包括二进制数据,这让它非常灵活。
3.丰富的操作命令:Redis提供了许多操作字符串的命令,比如SET、GET、INCR(用于整数类型的字符串,实现自增)、DECR(自减)等,可以满足各种复杂场景的需求。
4.原子性操作:Redis的很多字符串操作都是原子性的,这意味着这些操作在执行过程中不会被其他客户端的指令打断,保证了数据的一致性。
5.易于使用:Redis的字符串操作接口简单,易于理解和使用,无论是对于开发者还是运维人员来说,都是非常友好的。
6.这些好处使得Redis在处理字符串类型的数据时,相比其他类型的数据库或存储系统,具有非常明显的优势!

关于这个库的使用这里就先不讲,不然内容肯定会十分繁杂。

这是链接,可以自行看一下源码。

redis库             GitHub里的redis库


🆗到这里,这篇关于C语言字符串缺陷就说完了,求一个免费的赞,感谢阅读。还有一部分内容放到下期。

下期预告:C语言字符串缺陷的补充

 

 

 

相关文章:

C语言字符串缺陷

目录 补缺&#xff1a; 正题开始&#xff1a; 思考&#xff1a; 解决方案&#xff1a; 1.string类 2.redis库 简介&#xff1a; 对于处理字符串的好处&#xff1a; 下期预告&#xff1a;内容待定 补缺&#xff1a; 在上期内容的结尾我留下了一个问题&#xff0c;这个问…...

分布式场景中的常见的技术问题及解决,如分布式锁、分布式事务、分布式 session、分布式任务调度

目录 一、分布式锁 二、分布式事务 三、分布式Session 四、分布式任务调度 在分布式场景中&#xff0c;常见的技术问题及其解决方案涉及多个方面&#xff0c;包括分布式锁、分布式事务、分布式session和分布式任务调度。以下是对这些问题的详细探讨&#xff1a; 一、分布式…...

Android笔试面试题AI答之Kotlin(9)

文章目录 39.Kotlin中List与MutableList的区别&#xff1f;ListMutableList使用场景示例 40. Kotlin中实现单例的几种常见方式&#xff1f;1. 懒汉式&#xff08;线程不安全&#xff09;2. 懒汉式&#xff08;线程安全&#xff09;3. 饿汉式4. 双重校验锁&#xff08;DCL, Doub…...

C# 不一样的洗牌算法---Simd指令

洗牌算法&#xff0c;以随机打乱数组中元素的位置 测试数据创建 int[] _data; Random rng new Random(); protected override void CreateData() {_data new int[_size];for (int i 0; i < _data.Length; i){_data[i] i;} } 普通打乱数组元素位置 protected overrid…...

LVGL系列3--纯物理(外部)按键,数字键盘控制控件

LVGL系列 一、LVGL移植 LVGL系列1–AT32移植LVGL_V8具体步骤 LVGL系列2–linux lvglv8 vscode 移植 LVGL系列3–纯物理(外部)按键&#xff0c;数字键盘控制控件 文章目录 LVGL系列一、LVGL移植 一、背景方式一&#xff1a;自定义事件发送与处理函数方式二&#xff1a;利用l…...

FPGA开发——UART回环实现之接收模块的设计

一、简介 因为我们本次进行串口回环的实验的对象是FPGA开发板和PC端&#xff0c;所以在接收和发送模块中先编写接收模块&#xff0c;这样可以在后面更好的进行发送模块的验证。&#xff08;其实这里先编写哪个模块&#xff09;都不影响&#xff0c;这里看自己心情&#xff0c;反…...

Debezium系列之:记录一次SQLServer数据库数据不采集,恢复采集造成下游承压的情况,以及相对应的详细解决方案

Debezium系列之:记录一次SQLServer数据库数据不采集,恢复采集造成下游承压的情况,以及相对应的详细解决方案 一、背景二、查看CDC表情况三、 排查数据库是否开启代理四、排查表是否开启CDC五、下游承压情况六、解决方案一、背景 Connector状态正常,但几十台SQLServer数据库…...

Linux线程基础学习记录

0.线程特点 &#xff08;1&#xff09;.线程共享资源&#xff1a;一个进程下的多个线程共享以下资源 可执行的指令 静态数据 进程中打开的文件描述符 当前工作目录 用户ID 用户组ID &#xff08;2&#xff09;.线程私有资源&#xff1a; 线程ID PC(程序计数器&#xff09;和相…...

【Python学习-UI界面】PyQt5 小部件12-QStackedWidget 多页显示

功能和 QTabWidget 类似&#xff0c;它也有助于高效利用窗口的客户区域。 QStackedWidget 提供了一个窗口堆栈&#xff0c;每次只能查看一个窗口。它是建立在 QStackedLayout 之上的一个有用的布局。 样式如下: 右键可以变型为QTabWidget...

Mybatis中好用的元对象反射工具类 - MetaObject

一、前言 在获取map对象或者是其他深层嵌套对象&#xff0c;如果你的做法是挨个取出判空然后继续再向下查找&#xff0c;那么可以看看本文的方案&#xff0c;它或许能让你打开新的思路。 作为一名java开发人员&#xff0c;Mybatis几乎是我们无法避开的ORM框架&#xff0c;如果你…...

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级,nginx配置跨域

文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理&#xff1a;添加以下http响应头2.3. 四种跨域实现方式及优先级&#xff08;从高到低&#xff09; 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…...

深入理解JavaScript性能优化:从基础到高级

引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助开发者构建高效、流畅的Web应用…...

java+springboot实现定时任务

由于是初级程序员&#xff0c;基于注解的形式实现了一个简单的定时任务&#xff1b; 1. 使用Scheduled注解 Spring的Scheduled注解是一种非常简单和便捷的实现定时任务的方式。通过在方法上添加Scheduled注解&#xff0c;我们可以指定方法在特定的时间间隔或固定的时间点执行…...

1.3 数据库的发展历史与演变

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

The field file exceeds its maximum permitted size of 1048576 bytes

场景: 再系统后台上传解析对账文件时大小超过1M就会报错 分析: 排查错误时了解MultipartFile默认上传大小就是1M,但是发现项目配置文件配置了上传大小100M,但是这个大小没有生效 因为项目启动并没有使用到这个配置大小并把他应用到file配置里面,经过测试发现只需要增加配置…...

【Es】python es操作

表 因为es是集群所以es_hosts是列表 from elasticsearch import Elasticsearch ES_HOSTS ["127.0.0.1:9200"] ES_HTTP_AUTH "******************"# 连接Es es Elasticsearch(hostsES_HOSTS ,http_authES_HTTP_AUTH ,maxsize60,timeout30,max_retries3…...

吃透前端文件上传与文件相关操作 多文件上传 大文件切片上传 拖拽上传 后续还会更新 断点续传等等

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">**选择文件**</input>如果我们想限制上传文件的格式,大小或进行裁剪分片…...

用python制作88键赛博钢琴(能用鼠标键盘进行弹奏)

用python制作88键赛博钢琴 前言 恭喜这位博主终于想起了自己的账号密码&#xff01; 时光荏苒&#xff0c;转眼间已逾一年未曾在此留下墨香。尽管这一年间&#xff0c;博主投身于无尽的忙碌与挑战之中&#xff0c;但令人欣慰的是&#xff0c;那份初心与热情似乎并未因岁月的流…...

zdpgo_gin_login 框架20240815更新,增加注册路由的功能,一个方法自动拥有注册和登录两个API接口

zdpgo_gin_login 适配gin框架的登录注册功能组件&#xff0c;通过本框架轻松拥有登录注册相关的API接口 特性&#xff1a; 自动生成注册接口&#xff0c;具备密码加密的功能自动生成登录接口&#xff0c;具备JWT Token生成的功能 安装 go get github.com/zhangdapeng520/z…...

搭配Intel第13代酷睿处理器

高性能内存硬盘这么买 intel第13代酷睿已经于2022年10月底正式上市。相比于第12代酷睿性能大涨,内置20条PCle通道(16条PCle 5.0和4条PCle 4.0)、可最多支持128GB DDR5 5600/DDR4 3200双通道内存,搭配Z790系列主板组建高端性能平台,满足未来设计、游戏、专业应用等需求。如…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...