<10> string

c++ string 常用操作 c++11

 更多详细参考 std::basic_string - cppreference.com



1. 构造

2. 字符判断

3. 访问单个字符

4. 数值转换 

5.类STL操作,迭代器。 使用algorithm中的算法,比如sort排序,find查找等等

6.  支持的find查找函数

7. 子串
可以结合查找,获取到位置,然后通过位置得到子串

8. 正则表达式
        可以用于检查判断,比如UT中使用。某些情况下可以直接代替    6+7 查找获取子串

9. 字符串流
        很方便用于生成字符串,像cout输出一样生成字符串

10. 其他
        比较

全部在如下例子。

#include <iostream>
#include <cstring>
#include <string>
#include <cctype> // 字符判断

#include <regex> // 正则表达式

#include <sstream> //字符串流

#include <algorithm> //算法库

int main()
{

    // 1. 构造
    std::string str{"10hello world! Hello,World!  hello, hello"};
    std::string str2("1024");
    std::string str3;
    str3 = "str3!";
    std::cout << "1. -------construct" << std::endl;
    std::cout << str << std::endl;
    std::cout << str2 << std::endl;
    std::cout << str3 << std::endl;
    std::cout << "1. --------" << std::endl
              << std::endl;

    // 2.字符判断
    std::cout << "2. -------char" << std::endl;
    std::cout
        << " isspace:" << std::isspace(str[0])
        << " isalpha:" << std::isalpha(str[0])
        << " isdigit:" << std::isdigit(str[0])
        << std::endl;
    std::cout << "2. --------" << std::endl
              << std::endl;

    // 3.访问  size() front() back()  at()访问,下标访问
    std::cout << "3. --------rw" << std::endl;
    std::cout << "size:" << str.size()
              << " length:" << str.length()
              << " capacity:" << str.capacity()
              << " front:" << str.front()
              << " back:" << str.back()
              << " at(3):" << str.at(3)
              << std::endl;

    str.push_back('w');
    std::cout << " back:" << str.back() << std::endl;
    std::cout << "3. --------" << std::endl
              << std::endl;

    // 4. 数值转换
    // stoi()
    // stol()
    // stof()
    // stod()
    std::cout << "4. --------exchange" << std::endl;
    int d1 = std::stoi(str);
    std::cout << "d1 =" << d1
              << std::endl;
    int d2 = std::stoi(str2);
    std::cout << "d2 =" << d2
              << std::endl;

    try
    {
        int d3 = std::stoi(str3);
        std::cout << "d3 =" << d3
                  << std::endl;
    }
    catch (const std::exception &e)
    {
        std::cerr << " exception:" << e.what() << '\n';
    }

    size_t count = 0;
    auto d4 = std::stoi("128", &count, 16);
    // d4 的值为296. 这里第三个参数为16 ,表示按照16进制转换这个数
    //  16进制的 128 = 296
    std::cout << "stoi :" << d4 << " count:" << count << std::endl;

    std::cout << " to_stirng :" << std::to_string(12) << " " << std::to_string(12.02) << std::endl;
    std::cout << "4. --------" << std::endl
              << std::endl;

    // 5. 类STL操作,迭代器
    // 排序,查找等等
    std::cout << "5. -------algorithm" << std::endl;
    // 可以使用stl 里面的算法 <algorithm> 中定义了大约80个标准算法。
    // 比如 sort() find()
    std::string str_s{"hello015349147"};
    std::sort(str_s.begin(), str_s.end());
    std::cout << "sort :" << str_s << std::endl;
    // 设置第三个参数,可以自定义lambd。 这里用char的大小比较。
    std::sort(str_s.begin(), str_s.end(), std::greater<char>());
    std::cout << "sort down:" << str_s << std::endl;
    std::cout << "5. -------" << std::endl
              << std::endl;

    // 6.  find 查找系列函数
    std::cout << "6. -------find" << std::endl;
    auto p1 = str.find('w');     // 找字符
    auto p2 = str.find("world"); // 找子字符串
    auto p3 = str.rfind('w');    // 从末尾查找
    auto p4 = str.find('x');     // 找不到,则为 npos
    if (p4 == std::string::npos)
    {
        std::cout << "not found!" << std::endl;
    }
    auto p5 = str.find('!', 16); // 从某一个位置开始找
    auto p6 = str.find("lo", 10);

    std::cout << " p1:" << p1 << " p2:" << p2 << " p3:" << p3 << " p4:" << p4 << " p5:" << p5 << " p5=" << str[p5] << " p6=" << p6 << std::endl;

    // 循环查找所有的
    int p7 = -1;
    while ((p7 = str.find("he", p7 + 1)) != std::string::npos)
    {
        std::cout << " find: " << p7;
    }
    std::cout << std::endl;

    // std::string str{"10hello world! Hello,World!  hello, hello"};
    //                  0123456789012345678901234567890
    auto p8 = str.find_first_of("!, "); // first_of 是单个字符的查找,表示第一个属于字符串 "!, " 中任意一个字符的位置,这列这个字符串是 感叹号逗号空格,只要有这其中的任意一个,就找到。
    auto p9 = str.find_first_of("!, ", p8 + 1);
    auto p10 = str.find_first_not_of("0123456789");
    // p8 第7位,空格
    // p9 第13位,感叹号
    // p10 第二位, 非0~9的字符。
    // p8:7=  p9:13=! p10:2=h
    std::cout << " p8:" << p8 << "=" << str[p8] << " p9:" << p9 << "=" << str[p9] << " p10:" << p10 << "=" << str[p10] << std::endl;
    // 同理还有 str.find_last_of  find_last_not_of
    std::cout << "6. -------" << std::endl
              << std::endl;

    // 7. 子串
    // substr  可以结合查找,获取到位置,然后通过位置得到子串。
    std::cout << "7. -------substr" << std::endl;
    // 从第2个开始,长度为5
    std::string substr = str.substr(2, 5);
    // 结果为"hello"
    std::cout << " substr:" << substr << std::endl;
    std::cout << "7. -------" << std::endl
              << std::endl;

    // 8. 正则表达式
    std::cout << "8. -------regex" << std::endl;
    // https://blog.csdn.net/qq_34802416/article/details/79307102
    // 8.1 可以用于检查判断。
    // std::regex pat {"*hello*"}; //异常,正则表达式不合法。  *表示前一个元素重复,而这里前面没有定义
    // std::regex pat {"/*hello/*"}; // 匹配不到  使用了转义字符,意思是匹配字符 '*'
    std::cout << "regex_match:" << std::regex_match(str, std::regex(".*hello.*")) << std::endl;

    // 8.2 regex_search 某些情况下可以直接代替 6.+7. 查找获取子串
    std::cout << "regex_search " << std::regex_search(str, std::regex(".*hello.*")) << std::endl;

    std::string strsrc{"the video rtp port:8080, rtcp port 8081, audio rtp port 9090,rtcp port 9091"};

    std::smatch matches;
    std::string::const_iterator iterStart = strsrc.begin();
    std::string::const_iterator iterEnd = strsrc.end();
    std::string temp;
    while (regex_search(iterStart, iterEnd, matches, std::regex("\\d{4}")))
    {
        temp = matches[0].str();
        std::cout << temp << " ";
        iterStart = matches[0].second; //更新搜索起始位置,搜索剩下的字符串
    }
    std::cout << std::endl;
    std::cout << "8. -------" << std::endl
              << std::endl;

    // 9. 字符串流
    // 很方便用于生成字符串,像cout输出一样生成字符串
    std::cout << "9. -------sstream" << std::endl;
    std::stringstream ss;
    int i = 0xff;
    bool testb = false;
    ss << "hello" << str3 << i << testb << !testb;
    // 可以格式化输出,比如按照16进制输出,bool类型输出true和false
    // ss<<std::boolalpha; // 使用true和false的符号表示 ss<<noboolalpha 取消
    // ss<<std::showbase; // 输出八进制数加前缀0, 十六进制加前缀0x ss<<noshowbase
    // ss<<std::unitbuf;  // 每次都刷新到缓冲区。 ss<<nounitbuf
    // ss<<std::dec; //10进制
    // ss<<std::hex; //16进制
    // ss<<std::oct; //8进制

    ss << " bool:" << std::boolalpha << testb << " " << !testb << std::noboolalpha;
    ss << std::showbase;
    ss << " " << std::hex << 128;
    ss << " " << std::oct << 128;
    ss << " " << std::dec << 128;

    std::cout << ss.str() << std::endl;
    std::cout << "9. -------" << std::endl
              << std::endl;

    //  10. 常用操作
    // 比较
    // 用 == 进行全部的比较操作,用compare可以实现更高级的比较操作,比如部分比较。
    std::cout << std::boolalpha << " ==hello?" << (str == "hello") << std::endl;
    std::cout << " compare:" << str.compare(2, 5, "hello") << std::endl;
}
结果:// 在ubuntu 上的输出 c++11
1. -------construct
10hello world! Hello,World!  hello, hello
1024
str3!
1. --------

2. -------char
 isspace:0 isalpha:0 isdigit:1
2. --------

3. --------rw
size:41 length:41 capacity:41 front:1 back:o at(3):e
 back:w
3. --------

4. --------exchange
d1 =10
d2 =1024
 exception:stoi
stoi :296 count:3
 to_stirng :12 12.020000
4. --------

5. -------algorithm
sort :011344579ehllo
sort down:ollhe975443110
5. -------

6. -------find
not found!
 p1:8 p2:8 p3:41 p4:18446744073709551615 p5:26 p5=! p6=18
 find: 2 find: 29 find: 36
 p8:7=  p9:13=! p10:2=h
6. -------

7. -------substr
 substr:hello
7. -------

8. -------regex
regex_match:1
regex_search 1
8080 8081 9090 9091 
8. -------

9. -------sstream
hellostr3!25501 bool:false true 0x80 0200 128
9. -------

 ==hello?false
 compare:0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值