了解C++中的子字符串

时间:2020-02-23 14:30:06  来源:igfitidea点击:

在本文中,我们将介绍如何理解在C++中使用子字符串。

通常,在很多情况下,我们想从字符串中提取特定的模式。

在原始C中,我们需要自己手动提取它们。
但是,对于这种情况,C++标准库为我们提供了易于使用的功能。

让我们来看一些示例,看看如何使用此功能!

C++子字符串–基本语法

我们可以使用C++中的substring函数提取子字符串。
这是<string>头文件的一部分,因此我们必须包括它。

该函数的语法如下:

#include <string>

std::string substr(size_t pos, size_t len) const;

这个函数有两个参数,pos和len。

其中" pos"代表子字符串的起始索引,从0开始。

同样," len"代表子字符串的长度。
因此,从本质上讲,我们看一下字符串" original_string [pos]"到`original_string [pos + len-1]。

它将返回相应的字符串对象。

但是,如果pos=strlen(original_string),则只返回一个空字符串,因为string [last_pos] =‘\ 0’(空)!

如果pos>strlen(original_string),我们将收到一个out_of_range异常。

为了更好地理解这一点,让我们看一些示例。

在C++中使用子字符串–一些示例

让我们先来看一个简单的案例,在该案例中,我们将直接获取以下字符串的子字符串(前5个字符):

"公路上的你好"

#include <iostream>
#include <string>
using namespace std;

int main ()
{
string original_string = "Hello from theitroad";

//We want string[0:4] using substr()
string substring = original_string.substr(0,5);

cout << original_string << '\n';
cout << substring << '\n';

return 0;
}

输出

Hello from theitroad
Hello

确实,我们能够获得正确的子字符串!

让我们再看一个示例,在给定的匹配项之后打印子字符串。

我们将从第一个字符开始打印子字符串,直到找到匹配的字符串(" –")

我们可以将find()函数与substr()一起使用

#include <iostream>
#include <string>
using namespace std;

int main ()
{
string original_string = "Hello from -- theitroad";

//Let's find the position of "--" using str.find()
int position = original_string.find("--");

//We'll get the substring until this pattern
string substring = original_string.substr(0, position);

cout << original_string << '\n';
cout << substring << '\n';

return 0;
}

输出

Hello from -- theitroad
Hello from 

我们能够匹配子字符串直到给定的模式!

让我们再看一个示例,其中pos>strlen(original_string)

#include <iostream>
#include <string>
using namespace std;

int main ()
{
string original_string = "Hello from theitroad";

//Since 90 > strlen(original_string) = 24, this will raise an Exception
string substring = original_string.substr(90, 100);

cout << original_string << '\n';
cout << substring << '\n';

return 0;
}

输出

terminate called after throwing an instance of 'std::out_of_range'
what():  basic_string::substr: __pos (which is 90) > this->size() (which is 24)
[1]    236 abort (core dumped)  ./a.out

由于起始位置pos大于原始字符串的长度,因此我们得到一个out_of_range异常。

因此,每当使用str.substr()时都要小心,并始终确保检查字符串的长度,或者准备处理异常!