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.mzph.cn/diannao/29877.shtml

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

相关文章

【Git】多人协作 -- 详解

一、多人协作&#xff08;1&#xff09; ⽬前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git 基本操作&#xff0c;分支理解&#xff0c;版本回退&#xff0c;冲突解决等等。 申请码云账号&#xff0c;将远端信息 clone…

(微服务实战)聚合支付系统商户线上聚合收银台接口设计

1 概述 聚合支付收款分为线上和线下业务场景&#xff0c;本文中的商户收银台接口设计主要是指线上业务场景&#xff0c;线下业务场景聚合收款方式后续会进行单独设计和分析。 主流的线上支付渠道有微信支付&#xff0c;支付宝支付&#xff0c;云闪付。这三种支付渠道都有各自…

Linux操作系统学习:day04

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0422、通过文字设定法修改用户对文件的操作权限23、通过数字设定法修改文件的权限24、修改文件所有者和所属组25、tree—查看目录内…

Notes客户机开启事务日志

大家好&#xff0c;才是真的好。 了解过事务日志的人都知道——等等&#xff0c;你还不知道事务日志&#xff1f; 那我们先介绍一下&#xff0c;简单来说&#xff0c;Domino事务日志是捕获数据库更改并将其写入的记录&#xff0c;然后等服务器不繁忙或按计划更新到磁盘上的No…

虚拟机怎么额外搭建两个Redis节点,配置多个 Redis 实例

前提条件 在开始之前&#xff0c;请确保你已经具备以下条件&#xff1a; 一台已安装 Redis 的虚拟机。虚拟机上已安装基本的 Linux 工具&#xff08;例如 FinalShell&#xff09;。 步骤二&#xff1a;配置额外的 Redis 实例 接下来&#xff0c;我们将配置两个新的 Redis 实…

MYSQL无法启动的修复过程

记录一次MySQ无法启动的修复过程。 1. 错误表现 今天在用python操作数据库时可能有些错误&#xff08;具体来说就是我尝试创建了一个已经存在的database&#xff09;&#xff0c;结果我发现MySQL中的那个database不存在了&#xff0c;我重启了一下电脑&#xff0c;结果mysql…

数模E题——信号干扰下的超宽带(UWB)精确定位问题

E 题——信号干扰下的超宽带&#xff08;UWB&#xff09;精确定位问题 思路&#xff1a;该题主要问题是对干扰进行识别和自适应消除&#xff0c;得到更加理想的定位的结果 代码下载 第一题问题思路与结果&#xff1a; 主要是对文件进行解析并对其中存在的数据丢失进行补偿&am…

网页右键不能审查元素解决办法

网页右键不能审查元素解决办法 1.问题复现2.解决方法 1.问题复现 有的网站右键不能审查元素 这时是javascript 中的onselectstart"return false" 被禁止右键了。 2.解决方法 隐私和安全--->网络设置 网络设置--->javascript 然后回到不能审查元素的网页 …

C++ 03 之 命名空间

game_kun.cpp #include "game_kun.h"void kun::atk() {cout << "吃鸡的攻击"<< endl; } game_lol.cpp #include "game_lol.h"void lol::atk() {cout << "lol的攻击"<< endl; } game_kun.h #include <…

【shell脚本速成】for 嵌套和和 if 高级用法

文章目录 一、for嵌套二、for与数组三、if高级用法3.1、条件符号使用双圆括号&#xff0c;可以在条件中植入数学表达式 if (())3.2、使用双方括号,可以在条件中使用通配符 四、简写if五、与文件存在与否的判断六、课后练习 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &…

【ARMv8/ARMv9 硬件加速系列 3 -- SVE 指令语法及编译参数详细介绍】

文章目录 SVE 汇编语法SVE 单通道谓词SVE 测试代码SVE 软件和库支持SVE 编译参数配置-march=armv8-a+lse+profile+memtag+sve2-aes+sve2-bitperm+crypto+sve2+sve2-sha3+sve2-sm4SVE 汇编语法 在介绍 SVE 汇编指令语法之前,先介绍下如何判断自己所使用的芯片是否实现了SVE功能…

JY-156/1静态电压继电器 板前接线 约瑟JOSEF

JY-150系列电压继电器适用于继电保护线路中&#xff0c;作为过电压保护或低电压闭锁的动作元件。 该产品采用集成电路原理构成&#xff0c;它克服了原来电磁型电压继电器触点易抖动&#xff0c;工作时噪音大&#xff0c;动作值、返回值难调整及运输后动作值易变等缺点&#xff…

什么洗地机好用又实惠?四大口碑优品推荐,超级火爆

作为一个家电工作者&#xff0c;近年来测评了不少洗地机&#xff0c;相对于传统的清洁习惯&#xff0c;即先扫地&#xff0c;再拖地&#xff0c;洗地机能够在一拖一拉之间&#xff0c;便完成地面上的清洁&#xff0c;而且人们也不用低头弯腰的去清洁&#xff0c;可谓是省时省力…

【单片机毕业设计选题24013】-基于STM32的城市垃圾分类引导系统

系统功能: 1、系统具有语音识别功能&#xff0c;可以对厨余垃圾、其他垃圾、有害垃圾、可回收垃圾进行语音识别&#xff1b; 2、系统可根据语音识别结果直接开启对应类别的垃圾桶&#xff0c;引导分类投放&#xff1b; 3、系统具有语音播报功能&#xff0c;可以语音播报出识…

使用 swiper 轮播 echarts 图表,地图点击失效

问题 使用 swiper 轮播 echarts 图表&#xff0c;地图点击失效&#xff0c;伪代码如下 <Swiper><SwiperSlide>...</SwiperSlide>// 轮播中有地图<SwiperSlide><EchartsMap/></SwiperSlide><SwiperSlide>...</SwiperSlide> &…

同三维TT806-1 USB单路网络视频流/U盘采集卡

同三维TT806-1 USB单路网络视频流/U盘采集卡 (1路网络音视频信号或U盘直播推流器) 支持采集1路网络视频流或U盘音视频信号&#xff0c;USB输出到电脑 同时还可流推2个直播平台&#xff0c;可设置6组定时推流&#xff0c;有线网络 可录像到U盘&#xff0c;支持定时录像 一…

05 部署YUM软件仓库

5.1部署YUM软件仓库 5.1.1准备网络安装源 YUM软件仓库通常借助于HTTP或FTP协议来发布&#xff0c;这样可以面向网络中的所有客户机提供软件源服务。 1.准备软件仓库目录 在Center 7 系统的安装光盘中&#xff0c;已针对软件目录Packages建立好repodata数据&#xff0c;因此…

【向量检索】之向量数据库Milvus,Faiss详解及应用案例

Reference https://www.modb.pro/db/509268 笔记︱几款多模态向量检索引擎&#xff1a;Faiss 、milvus、Proxima、vearch、Jina等 - 知乎 (zhihu.com) 向量数据库入坑指南&#xff1a;聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss - 苏洋的文章 - 知乎 常用的三种索引方…

fastapi修改docs文档页面favicon.ico图标

如下图&#xff0c;文档页面默认使用的是tiangolo大神的Logo 如果打开的标签比较多&#xff0c;就不好区分了&#xff0c;想要修改这个logo&#xff0c;可以用fastapi-cdn-host一行代码搞定 fastapi_cdn_host.patch_docs(app, favicon_url/static/logo.png) 例如&#xff1a;…

react-2 jsx的学习

1.什么是JSX&#xff1f; 概念&#xff1a;JSX就是Javascript和XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在js代码中编写HTML模板结构&#xff0c;它是React中编写UI模板的方式&#xff0c;如下图就是jsx: 优势&#xff1a;1.HTML的声明式模板写法&#xff1b;…