c++中string用法详解

目录

二、案例需求

三、案例实现

1.首先获取strData中的角色数量

2.创造结构体数组,定义两个索引值

3.循环遍历对结构体User中的Id和Exp进行赋值

4.对结构体数组userArr进行排序

5.展示结果以及最终代码

​四、最后


一、前言

        在C++中,std::string 是一个非常重要的类,用于处理字符串。它是标准模板库(STL)的一部分,并且定义在 <string> 头文件中。

        std::string类中有非常多的api用法,例如返length()返回字符串的长度(字符数),substr() 提取子字符串,replace() 替换子字符串或字符的个数等等。

        但是我不想逐个讲述string类中的api方法,那样没有实际的意义,下面我想通过一个实际的案例来加深你对string用法的印象。

二、案例需求

string strData = "id=TomyClare;exp=9521;id=Sunny;exp=9523;id=DyBaby;exp=25321;id=Simple;exp=25321;id=Bkacs11;exp=2100;";

上面有一段字符串,需求如下:

  1. 依次获取字符串中的数据id(角色名字)和exp(角色武力值),并且放入结构体数组userArr中,结构体定义如下:
    typedef struct User
    {string Id;int Exp;
    }* pUser;
  2. 将结构体数组中的角色按照exp(角色武力值)进行从大到小排序,如果exp相同则按照id首字母进行排序,并最终打印结构体中角色的数据。

三、案例实现

案例思路:

1.首先获取strData中的角色数量

        根据我们对字符串的观察,strData中的角色数量可以根据字符串中的";"数量除于2得到。

";"对应的ASCII表中的数字59。于是我们可以遍历字符串,并且进行判断得到";"的数量。

代码实现如下:

    // 整个数据string strData = "id=TomyClare;exp=9521;id=Sunny;exp=9523;id=DyBaby;exp=25321;id=Simple;exp=25321;id=Bkacs11;exp=2100;";// ";"数量int count{ 0 };for (auto item : strData){// 将item字符char类型转换为int类型进行比较,相同count++if ((int)item == 59) count++;}// 角色数量为: 5int Usercount{ count / 2 };cout << "整个角色数量为:" << Usercount << endl;  
2.创造结构体数组,定义两个索引值
    pUser userArr = new User[Usercount];int startIndex{ 0 }, endIndex{ 0 };

        startIndex和endIndex两个索引值变量非常重要,分别代表需要获取id值和exp值的下标,每次会变化。

如下图所示:

3.循环遍历对结构体User中的Id和Exp进行赋值

代码如下:

    for (int i = 0; i < Usercount; i++){//"id="中的 i的索引startIndex = strData.find("id=",startIndex);//";" 的索引endIndex = strData.find(";",startIndex + 3);// 截取的Id 例如:TomyClareuserArr[i].Id = strData.substr(startIndex + 3,endIndex - startIndex - 3);startIndex = endIndex + 1;startIndex = strData.find("exp=", startIndex);endIndex = strData.find(";",startIndex + 4);// 截取的Exp 例如:9521   stoi() 将string类型转换为int类型userArr[i].Exp = stoi(strData.substr(startIndex + 4,endIndex - startIndex - 4));// 测试是否赋值成功cout << userArr[i].Id << " " << userArr[i].Exp << endl;}

重点为:startIndex和endIndex两个索引值变量会根据循环不断发生改变,用图片看很好理解。

        在循环赋值操作中分别用到了find() 查找子字符串或字符的位置和substr() 提取子字符串两个std::string方法。

find()函数的详细解释:获取指定字符串的索引值

size_type find(const string& str, size_type pos = 0) const noexcept;

  • str:要查找的子串。
  • pos(可选):开始查找的位置。默认为0,表示从字符串的开头开始查找。

substr()函数的详细解释:用来提取字符串

std::string substr(size_t pos = 0, size_t len = npos) const;

  • pos:起始索引,即子串在字符串中开始的位置(包含在内)。索引从0开始。
  • len:子串的长度(不包含终止索引)。如果省略或提供的值大于从pos到字符串末尾的长度,那么substr()将提取从pos到字符串末尾的所有字符。默认值为std::string::npos,这是一个特殊的常量,表示直到字符串的末尾。

4.对结构体数组userArr进行排序

        排序主要运用了冒泡排序,比较简单,这里就不再进行再多的叙述了,代码如下:

    for (int i = 0; i < Usercount; i++){for (int j = 0; j < Usercount - i - 1; j++){if (userArr[j].Exp <= userArr[j + 1].Exp){User temp = userArr[j];userArr[j] = userArr[j + 1];userArr[j + 1] = temp;}// 武力值相同,对角色id进行排序else if (userArr[j].Exp == userArr[j + 1].Exp){if (userArr[j].Id.compare(userArr[j + 1].Id) == -1){User temp = userArr[j];userArr[j] = userArr[j + 1];userArr[j + 1] = temp;}}}}
5.展示结果以及最终代码

代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;typedef struct User
{string Id;int Exp;
}* pUser;int main()
{// 整个数据string strData = "id=TomyClare;exp=9521;id=Sunny;exp=9523;id=DyBaby;exp=25321;id=Simple;exp=25321;id=Bkacs11;exp=2100;";// ";"数量int count{ 0 };for (auto item : strData){// 将item字符char类型转换为int类型进行比较,相同count++if ((int)item == 59) count++;}// 角色数量为: 5int Usercount{ count / 2 };cout << "整个角色数量为:" << Usercount << endl;  pUser userArr = new User[Usercount];// int startIndex{ 0 }, endIndex{ 0 };for (int i = 0; i < Usercount; i++){//"id="中的 i的索引startIndex = strData.find("id=",startIndex);//";" 的索引endIndex = strData.find(";",startIndex + 3);// 截取的Id 例如:TomyClareuserArr[i].Id = strData.substr(startIndex + 3,endIndex - startIndex - 3);startIndex = endIndex + 1;startIndex = strData.find("exp=", startIndex);endIndex = strData.find(";",startIndex + 4);// 截取的Exp 例如:9521 userArr[i].Exp = stoi(strData.substr(startIndex + 4,endIndex - startIndex - 4));// 测试是否赋值成功cout << userArr[i].Id << " " << userArr[i].Exp << endl;}for (int i = 0; i < Usercount; i++){for (int j = 0; j < Usercount - i - 1; j++){if (userArr[j].Exp <= userArr[j + 1].Exp){User temp = userArr[j];userArr[j] = userArr[j + 1];userArr[j + 1] = temp;}// 武力值相同,对角色id进行排序else if (userArr[j].Exp == userArr[j + 1].Exp){if (userArr[j].Id.compare(userArr[j + 1].Id) == -1){User temp = userArr[j];userArr[j] = userArr[j + 1];userArr[j + 1] = temp;}}}}for (int i = 0; i < Usercount; i++){cout << endl;cout << "排序后的数据";cout << userArr[i].Id << " " << userArr[i].Exp << endl;}
}

结果图片:

四、最后

        制作不易,熬夜肝的,虽然质量感觉有些欠佳,但还请各位彦祖们点点赞,拯救下秃头的博主吧!!这几天学习进度有些懈怠,我会反思自己,争取每天做到7小时高效学习!!!

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

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

相关文章

UITableView之显示单组数据Demo

需求 UITableView实现显示单组数据。尝试设置不同行高度不同。 效果&#xff1a; 数据展示 实现 与之前分组显示数据的区别在于懒加载的数据模型不同。 &#xff08;1&#xff09;声明数据模型类 类的属性一定要和plist中数据的字段保持一致 interface CZhero : NSObject /…

【Android】使用SeekBar控制数据的滚动

项目需求 有一个文本数据比较长&#xff0c;需要在文本右侧加一个SeekBar&#xff0c;然后根据SeekBar的上下滚动来控制文本的滚动。 项目实现 我们使用TextView来显示文本&#xff0c;但是文本比较长的话&#xff0c;需要在TextView外面套一个ScrollView&#xff0c;但是我…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

vue中通过自定义指令实现一个可拖拽,缩放的弹窗

效果 功能描述 按住头部可拖拽鼠标放到边框&#xff0c;可缩放多层重叠丰富的插槽&#xff0c;易于扩展 示例 指令代码 export const dragDialog {inserted: function (el, { value, minWidth 400, minHeight 200 }) {// 让弹窗居中let dialogHeight el.clientHeight ?…

Vue.js结合ASP.NET Core构建用户登录与权限验证系统

1. 环境准备2. 创建项目3. Vue配置步骤一: 安装包步骤二: 配置文件步骤三: 页面文件 4. 后台配置 在本教程中&#xff0c;我将利用Visual Studio 2022的强大集成开发环境&#xff0c;结合Vue.js前端框架和ASP.NET Core后端框架&#xff0c;从头开始创建一个具备用户登录与权限验…

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求&#xff0c;常用做法是左侧显示子页面菜单&#xff0c;用户通过点击左侧菜单&#xff0c;实现右边子页面的展示。 实例项目实现&#xff1a; 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

部署yum仓库

目录 安装软件包 yum 配置文件 缓存功能操作步骤 创建并配置本地仓库文件 yum相关命令 yum install __ yum repolist yum list __ yum info __ yum search __ yum whatprovides __ yum remove __ yum -y update __ yum history yum grouplist yum groupinstall…

MySQL数据库与基本操作(增删改查)

一、数据库的基本概念 数据库要学习的四个基本概念&#xff0c;主要是&#xff1a;数据、数据库系统、数据库、数据管理系统。数据&#xff08;Date&#xff09;是描述事物的记录&#xff0c;数据库系统&#xff08;DBS&#xff09;&#xff0c;数据库管理系统&#xff08;DBMS…

微服务开发与实战Day08 - Elasticsearch

一、初始Elasticsearch 高性能分布式搜索引擎 1. 认识和安装 1.1 认识 Lucene是一个Java语言的搜索引擎类库&#xff0c;是Apache公司的顶级项目&#xff0c;由DougCutting于1999年研发。官网地址&#xff1a;Apache Lucene - Welcome to Apache Lucene Lucene的优势&…

PaddleOCR学习——PP-OCR系列

相关知识前置&#xff1a; PP-LCNet PP-LCNetV3 PP-LCNetV3系列模型是PP-LCNet系列模型的延续&#xff0c;覆盖了更大的精度范围&#xff0c;能够适应不同下游任务的需要。PP-LCNetV3系列模型从多个方面进行了优化&#xff0c;提出了可学习仿射变换模块&#xff0c;对重参数…

corona渲染器与vray比哪个好?支持云渲染平台吗

​在视觉渲染技术领域&#xff0c;V-Ray和Corona都以其卓越的性能和广泛应用赢得了高度评价。这两款渲染器各有其独特的优势&#xff0c;使得在它们之间做出选择并非易事。不同的应用场景和用户需求可能会让它们各自展现出不同的优势。 一、corona渲染器跟vray怎么样 在比较V-…

制造业为什么需要ERP企业管理软件?

如今&#xff0c;传统的制造业管理方式逐渐变得力不从心~库存积压、生产效率低下、供应链混乱…想象一下&#xff0c;如果你的企业仍然依赖于手工记录订单、库存和财务数据&#xff0c;那么每当市场发生变动时&#xff0c;你就需要花费大量的时间和精力去重新调整生产计划、更新…

派克比例阀

派克比例阀 PARKER比例阀技术特征 阀芯位移反馈设计 阀之间的重复性 故障安全型中位功能 必须调整扭杆以允许&#xff08;秉圣135陈工6653负载3053&#xff09;传感比例阀介入需要时制动回路。但是&#xff0c;要小心液压回路受压时不能调整拉杆。测试应在压力缓慢上升期间…

Github2024-06-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4JavaScript项目2Lua项目1PHP项目1Blade项目1非开发语言项目1TypeScript项目1Shell项目1从零开始构建你喜爱的技术 创建周期:2156 天…

Excel 常用技巧(四)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件&#xff0c;可以用来制作电子表格、完成许多复杂的数据运算&#xff0c;进行数据的分析和预测&#xff0c;并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

利用C#和Snap7工具模拟S7通信(包含DB地址讲解)

之前写过一篇用KepServerEx做模拟S7的通信数据&#xff0c;参考链接&#xff1a; 通过C#和KepServer完成模拟S7协议通信_c# 与kepserver-CSDN博客 但KepServerEx是收费的&#xff0c;而且模拟的DB块超过64就不行了&#xff0c;当然Snap7在本文中也是只能模拟DB1、DB2和DB3的数…

玄机平台流量特征分析-常见攻击事

前言 熟悉常见的攻击流量特征&#xff0c;我们就可以通过主机的一个流量情况来判断主机遭受了何种攻击。这里来看看玄机平台的一道题目。 步骤1.1 这里需要我们找出恶意扫描者&#xff0c;也就是黑客的ip。下载好附件之后用wiresharke打开&#xff0c;直接筛选http协议的流量…

2-9 基于matlab的传递矩阵计算轴的模态

基于matlab的传递矩阵计算轴的模态&#xff0c;包括模态频率和模态振型&#xff0c;可设置轴的结构参数。程序已调通&#xff0c;可直接运行。 2-9 传递矩阵计算轴的模态 模态频率 - 小红书 (xiaohongshu.com)

ETL可视化工具 DataX -- 简介( 一)

引言 DataX 系列文章&#xff1a; ETL可视化工具 DataX – 安装部署 ( 二)ETL可视化工具 DataX – DataX-Web安装 (三) 1.1 DataX 1.1.1 Data X概览 DataX 是阿里云DataWorks数据集成的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现…

【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【Go语言精进之路】 文章目录 引言一、Go语言的字符串类型1.1 字符串的定义1.2 字符串的零值可用1.3 字符串的不可变性1.4 字符串的拼接1.5 字符串的常用方法1.6 实际使用示例 二、字符串的内部表…