目录
二、案例需求
三、案例实现
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;";
上面有一段字符串,需求如下:
- 依次获取字符串中的数据id(角色名字)和exp(角色武力值),并且放入结构体数组userArr中,结构体定义如下:
typedef struct User {string Id;int Exp; }* pUser;
- 将结构体数组中的角色按照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小时高效学习!!!