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