在日常开发中,我们经常需要对字符串进行截取操作来获取需要的信息。在C++中,我们可以使用string类提供的substr()函数来完成字符串截取操作。本文将从多个角度分析string截取字符串的方法和技巧。
一、substr()函数的使用
substr()函数的语法如下:
string substr(size_t pos = 0, size_t len = npos) const;
其中,pos表示截取的起始位置,len表示截取的长度。如果不指定len,则默认截取到字符串的末尾。
例如,下面的代码截取了字符串str中从第2个字符开始的3个字符:
```C++
string str = "hello world";
string sub = str.substr(1, 3);
cout << sub; // 输出ell
```
二、截取多个子字符串
有时候我们需要从一个字符串中截取多个子字符串,可以通过循环调用substr()函数来实现。例如,下面的代码截取了字符串str中以空格分隔的多个子字符串:
```C++
string str = "hello world";
vector
size_t pos = 0;
while ((pos = str.find(" ")) != string::npos) {
subs.push_back(str.substr(0, pos));
str.erase(0, pos + 1);
}
subs.push_back(str);
for (auto sub : subs) {
cout << sub << endl;
}
```
三、截取指定字符之间的子字符串
有时候我们需要截取字符串中两个指定字符之间的子字符串。可以通过find()函数和substr()函数结合使用来实现。例如,下面的代码截取了字符串str中两个冒号之间的子字符串:
```C++
string str = "key:value";
size_t pos1 = str.find(":");
size_t pos2 = str.find(":", pos1 + 1);
string sub = str.substr(pos1 + 1, pos2 - pos1 - 1);
cout << sub; // 输出value
```
四、截取文件名和扩展名
有时候我们需要从文件路径中截取文件名和扩展名。可以通过rfind()函数和substr()函数结合使用来实现。例如,下面的代码截取了文件路径中的文件名和扩展名:
```C++
string path = "C:/Users/abc/123.txt";
size_t pos1 = path.rfind("/");
size_t pos2 = path.rfind(".");
string filename = path.substr(pos1 + 1, pos2 - pos1 - 1);
string ext = path.substr(pos2 + 1);
cout << filename << endl; // 输出123
cout << ext << endl; // 输出txt
```
五、截取指定长度的子字符串
有时候我们需要截取字符串中指定长度的子字符串。可以通过substr()函数和string::npos结合使用来实现。例如,下面的代码截取了字符串str中前5个字符:
```C++
string str = "hello world";
string sub = str.substr(0, 5);
cout << sub; // 输出hello
```
六、结合正则表达式进行截取
有时候我们需要根据正则表达式来截取字符串中的子字符串。可以使用C++11中新增的regex类来实现。例如,下面的代码使用正则表达式截取了字符串str中所有数字:
```C++
string str = "abc123def456";
regex reg("\\d+");
sregex_iterator it(str.begin(), str.end(), reg);
sregex_iterator end;
while (it != end) {
cout << it->str() << endl;
++it;
}
```
七、截取UTF-8编码的字符串
在处理中文字符串时,我们需要考虑UTF-8编码的问题。可以使用第三方库utf8-cpp来实现UTF-8编码的字符串截取。例如,下面的代码截取了UTF-8编码的字符串str中的前5个字符:
```C++
#include "utf8.h"
string str = "你好,世界";
string sub;
utf8::unchecked::iterator
utf8::unchecked::iterator
utf8::unchecked::append(it, end, back_inserter(sub));
cout << sub; // 输出你好,
```