目录
二、案例需求
三、案例实现
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++;
}
// 角色数量为: 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;
}
}
结果图片:
四、最后
制作不易,熬夜肝的,虽然质量感觉有些欠佳,但还请各位彦祖们点点赞,拯救下秃头的博主吧!!