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++;
    }
    // 角色数量为: 5
    int 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 例如:TomyClare
        userArr[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++;
    }
    // 角色数量为: 5
    int 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 例如:TomyClare
        userArr[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;
    }
}

结果图片:

四、最后

        制作不易,熬夜肝的,虽然质量感觉有些欠佳,但还请各位彦祖们点点赞,拯救下秃头的博主吧!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webshell三巨头 综合分析(蚁剑,冰蝎,哥斯拉)

考点: 蚁剑,冰蝎,哥斯拉流量解密 存在3个shell 过滤器 http.request.full_uri contains "shell1.php" or http.response_for.uri contains "shell1.php" POST请求存在明文传输 ant 一般蚁剑执行命令 用垃圾字符在最开头填充 去掉垃圾字符直到可以正常bas…

STM32MP135裸机编程:配置RCC,修改主频到1GHz

0 工具准备 STM32CubeMX v6.11.1 STM32CubeIDE v1.15 STM32CubeProgrammer v2.16.0 STM32MP13xx参考手册 STM32MP13勘误手册 STM32MP135AD数据手册 正点原子stm32MP135开发板 1 确认时钟源 本例使用的时钟源均由外部晶振提供&#xff0c;分别是24MHz的HSE、32.768KHz的LSE。原…

服务器制作RAID磁盘阵列并管理

1. 规划节点 主机规划 IP主机名节点192.168.100.10localhost控制节点 2. 基础准备 使用VMWare Workstation软件安装CentOS 7.2操作系统&#xff0c;镜像使用提供的 CentOS-7-x86_64-DVD-1511.iso&#xff0c;并添加4块20 GB硬盘。YUM源使用提供的 mdadm_yum文件夹。 1. 创…

R可视化:ggpubr包学习

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者 Xiao hong书&#xff1a;生信学习者 知hu&#xff1a;生信学习者 CDSN&#xff1a;生信学习者2 介绍 ggpubr是我经常会用到的R包&#xff0c;它傻瓜式的画图方式对很多初次接触R绘图的人来…

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

Thinkphp一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码&#xff0c;喜欢的朋友可以下载研究 一文鸡富贵鸡玫瑰庄园富农场仿皮皮果理财农场源码

什么是自适应滤波器?

一、自适应滤波器 自适应滤波器是一种能够自动调整其滤波参数以匹配输入信号特性变化的滤波器&#xff0c;主要用于信号处理中选择性地通过特定频率范围内的信号&#xff0c;同时抑制其他频率成分。自适应滤波器主要有几种&#xff1a; LMS (Least Mean Squares) 自适应滤波器…

pytest+requests+allure自动化测试接入Jenkins学习

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近在这整理知识&#xff0c;发现在pytest的知识文档缺少系统性&#xff0c;这里整理一下&…

react 搭建简单的后台管理系统

1.分析后台组成 后台基本组成是由菜单、头部、内容区域组成 2 后台具体实现 2.1 整体页面布局 页面整体布局为侧边栏(CommonAside)、头部(CommonHeader)、标签区域(CommonTag)、内容区域(Content)四部分组成&#xff0c;展开和收起功能是把展开和收起的状态&#xff0c;用一个…

Unity基础(三)3D场景搭建

目录 简介: 一.下载新手资源 二.创建基本地形 三.添加场景细节 四,添加水 五,其他 六. 总结 简介: 在 Unity 中进行 3D 场景搭建是创建富有立体感和真实感的虚拟环境的关键步骤。 首先&#xff0c;需要导入各种 3D 模型资源&#xff0c;如建筑物、角色、道具等。这些模…

Java——IO流(一)-(3/8):File案例练习-文件遍历,文件搜索,删除非空文件夹,啤酒问题(需求分析、问题解决、运行结果)

目录 文件遍历&#xff08;遍历所有文件及文件夹&#xff09; 需求分析 问题解决 运行结果 文件搜索 需求分析 问题解决 运行结果 删除非空文件夹 啤酒问题&#xff08;递归案例&#xff09; 文件遍历&#xff08;遍历所有文件及文件夹&#xff09; 需求分析 需求&am…

【全开源】医护上门系统小程序APP公众号h5源码

医护上门系统&#xff1a;健康守护&#xff0c;就在您身边 &#x1f6aa;引言&#xff1a;开启全新的医护模式 在快节奏的现代生活中&#xff0c;健康问题往往成为我们关注的焦点。而“医护上门系统”正是为了满足这一需求&#xff0c;将专业的医疗服务送到您的家中。这一创新…

Github 2024-06-12 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10PHP项目1PLpgSQL项目1C++项目1Ventoy: 100%开源的可启动USB解决方案 创建周期:1534 天开发语言:C协议类型:GNU General Public Licen…

SpringCloud 网关Gateway配置并使用

目录 1 什么是网关&#xff1f; 2 Gateway的使用 2.1 在其pom文件中引入依赖 2.2 然后gateway配置文件中配置信息 2.3 启动网关微服务 3 网关处理流程 4 前端-网关-微服务-微服务间实现信息共享传递 1 什么是网关&#xff1f; 网关&#xff1a;就是网络的关口&#xff…

可视化剪辑,账号矩阵管理,视频分发,聚合私信多功能一体化营销工具 源代码开发部署方案

可视化剪辑&#xff0c;账号矩阵管理&#xff0c;视频分发&#xff0c;聚合私信多功能一体化营销工具 源代码开发部署方案 可视化剪辑&#xff1a; 可视化剪辑开发是一种通过图形化界面和拖放操作&#xff0c;以可视化的方式进行影片剪辑和编辑的开发方法。它可以让非专业用户…

Java的一些补充性介绍

目录 什么是JDK&#xff0c;JRE 快速入门 学习路线&#xff1a; 如何快速掌握技术或知识点&#xff1a; IDEA 常用快捷键 IDEA创建项目、模块、包、类 模板/自定义模板 包 包的命名&#xff1a;​编辑 常用的包 如引入包 断点调试(debug)​编辑 多线程&#xff1a;…

字符串循环遍历抵消、队列的应用-649. Dota2 参议院

题目链接及描述 649. Dota2 参议院 - 力扣&#xff08;LeetCode&#xff09; 题目分析 题目描述的意思&#xff1a;对于一个字符串循环执行抵消操作&#xff0c;&#xff08;R的个数为1时可以使后续的一个D失效&#xff0c;D的个数为1时可以使后续的一个R失效&#xff09;【相…

iOS18首个Beta测试版发布,功能介绍附beta升级办法!

今天凌晨&#xff0c;一年一度的苹果WWDC24开发者大会正式开幕&#xff0c;发布了iOS 18、iPadOS 18、macOS Sequoia、watch OS11等新系统。 大会结束后&#xff0c;苹果火速发布了首个iOS 18开发者Beta版&#xff0c;目前有开发者资格的用户已经可以下载体验尝鲜了。 本次更新…

unity开发Hololens编辑器运行 按空格没有手

选择DictationMixedRealityInputSystemProfile 如果自定义配置文件 需要可能需要手动设置 手部模型和材质球

ClickHouse快速安装教程(MacOS)

文章目录 ClickHouse快速安装教程&#xff08;MacOS&#xff09;1.ClickHouse2.快速安装3.快速启动3.1.启动服务器3.2.启动客户端 4.使用案例1.配置文件2.启动CK服务3.创建数据库4.创建表5.插入数据6.查询数据 ClickHouse快速安装教程&#xff08;MacOS&#xff09; 1.ClickHo…

YOLO检测环境安装配置

YOLO介绍 YOLO学习手册&#xff1a;YOLO教程 YOLO [ˈjoʊloʊ]&#xff08;You Only Look Once&#xff09;是一种快速而准确的目标检测算法&#xff0c;由Joseph Redmon等人在2016年提出。YOLO被广泛应用于计算机视觉领域&#xff0c;包括实时视频分析、自动驾驶、安防监控、…