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;
    }
}

结果图片:

四、最后

        制作不易,熬夜肝的,虽然质量感觉有些欠佳,但还请各位彦祖们点点赞,拯救下秃头的博主吧!!这几天学习进度有些懈怠,我会反思自己,争取每天做到7小时高效学习!!!

  • 18
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ string 是一个类,可以用来存储和操作字符串。使用 string 类型需要包含头文件 <string>。 string 类型的特点如下: 1. 可以动态改变字符串的长度。 2. 支持下标访问、迭代器操作和常用的字符串操作函数(如 find、substr 等)。 3. 可以与 C 语言的字符串(即以 '\0' 结尾的字符数组)进行互相转换。 下面是一些常用的 string 类型操作: 1. 初始化字符串: ```cpp string str1 = "hello"; // 直接用字符串初始化 string str2("world"); // 用字符数组初始化 string str3(5, 'a'); // 用字符和长度初始化 ``` 2. 获取字符串长度: ```cpp int len = str.length(); // 获取字符串长度 ``` 3. 字符串拼接: ```cpp string str4 = str1 + str2; // 直接使用加号拼接字符串 str1 += str2; // 使用加等于号拼接字符串 ``` 4. 字符串查找: ```cpp int pos = str.find("world"); // 查找子串,返回第一次出现的位置 ``` 5. 字符串截取: ```cpp string substr = str.substr(pos, len); // 截取子串,从 pos 开始,长度为 len ``` 6. 字符串转换为字符数组: ```cpp const char* cstr = str.c_str(); // 获取指向字符数组的指针 ``` 7. 字符数组转换为字符串: ```cpp string str5 = "hello"; const char* cstr2 = "world"; string str6 = str5 + cstr2; // 直接使用加号拼接字符串和字符数组 string str7(cstr2); // 使用字符数组初始化 ``` 以上是 string 类型的一些常用操作,具体用法还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值