#include<iostream>
#include<string>
using std::string;
string Ranking{ "id=Tomy Clare;exp=9523;id=Sunny;exp=9523;id=DyBaby;exp=25301;id=Bkacs11;exp=2100;id=Dumpx;exp=3652066;" };
typedef struct User {
string id{0};
int Exp{0};
}*User_ptr;
int main() {
int istart{}, iend{}, icunt{};
for (int i = 0; i < Ranking[i]; i++)
{
istart = Ranking.find(";", istart + 3); // istart 起始位置 开始查找;号的总数 除以2 是用户的总数
if (istart == std::string::npos)break; //判断 istart 返回结果 -1 结束循环
iend++; //istart +1 防止同一位置 不断查找 死循环;
}
User_ptr user = new User[iend]; //定义内存 iend / 2 之后溢出 求大佬解答 暂时 iend(10);
istart = 0; //初始化
for (int i = 0; i < iend; i++)
{
icunt = Ranking.find("id=", icunt); //查找id= 位置返回数值;
if (icunt == std::string::npos)break; //判断 istart 返回结果 -1 结束循环
istart = Ranking.find(";", icunt); // 查找 istart 起始后的;号 返回数值;
user[i].id = Ranking.substr(icunt+3, istart - icunt -3); //给user[i].id 截取字节赋值 icunt+3为起始位置 istart - icunt -3 截取的字节数量
icunt = Ranking.find("exp", icunt); //查找exp 位置返回数值;
istart = Ranking.find(";", icunt); // 查找 istart 起始后的;号 返回数值;
user[i].Exp = std::stoi(Ranking.substr(icunt + 4, istart - icunt)); //user[i].Exp为整形 需要先用 std::stoi 转换在进行赋值
icunt++;
}
for (int j = 0; j < iend; j++) //冒泡算法
{
for (int i = 1; i < iend ; i++)
{
if (user[i].Exp > user[i-1].Exp)
{
User tmp = user[i - 1];
user[i - 1] = user[i];
user[i] = tmp;
}
}
}
for (int i = 0; i < iend / 2; i++) //打印结果
{
std::cout << user[i].id << "\t" << user[i].Exp << "\n";
}
}
|