问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深入理解C++中substr()函数的使用

创作时间:
作者:
@小白创作中心

深入理解C++中substr()函数的使用

引用
CSDN
1.
https://blog.csdn.net/2201_75539691/article/details/145100333

在C++语言的学习中,字符串处理是一个非常重要的内容,而substr()函数作为std::string类中的成员函数,为我们提供了提取子字符串的便捷操作。在本文中,我们将深入解析substr()函数的用法,包括其函数原型、参数意义、使用场景以及常见的错误和注意事项。同时,还会拓展substr()与其他函数(如find())的配合使用,以帮助读者更好地理解和掌握字符串操作的技巧。

本文内容基于一节关于substr()函数的课程整理而成,并进行了优化和拓展,以便于初学者和进阶学习者参考。

函数概述

substr()函数用于截取字符串中指定位置和长度的子串。其函数原型如下:

string substr(size_t pos = 0, size_t len = npos) const;

参数说明:

  • pos: 指定子字符串的起始位置(从0开始计数)。如果未传入参数,则默认从字符串的起点(pos = 0)开始。
  • len: 子字符串的长度。若未传入参数,则默认值为npos,表示从起始位置一直截取到字符串的末尾。

返回值:

返回截取得到的子字符串,类型为std::string。

基础用法示例

示例1:从指定位置提取到字符串末尾

以下代码展示了如何从字符串的某个位置开始提取到末尾的子串:

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

int main() {
    string s = "hello world hello everyone";
    string s1 = s.substr(7);
    cout << s1 << endl;  // 输出: "orld hello everyone"
    return 0;
}

解析

  • s.substr(7)表示从下标7处(字符o)开始,一直截取到字符串的末尾。
  • 输出结果为:orld hello everyone。

示例2:从指定位置提取固定长度的子串

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

int main() {
    string s = "hello world hello everyone";
    string s2 = s.substr(7, 5);
    cout << s2 << endl;  // 输出: "orld "
    return 0;
}

解析

  • s.substr(7, 5)表示从下标7处开始,截取长度为5的子串。
  • 输出结果为:orld 。

substr()与find()函数的结合

示例3:配合find()提取子串

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

int main() {
    string s = "hello world hello everyone";
    size_t pos = s.find("world");
    if (pos != string::npos) {
        string s3 = s.substr(pos, 5);
        cout << s3 << endl;  // 输出: "world"
    }
    return 0;
}

解析

  • 使用find()函数查找"world"的位置,然后使用substr()函数从该位置截取长度为5的子串。
  • 输出结果为:world。

注意事项

越界问题

示例4:越界示例

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

int main() {
    string s = "hello world hello everyone";
    try {
        string s4 = s.substr(20, 10);
        cout << s4 << endl;
    } catch (const out_of_range& e) {
        cout << "Error: " << e.what() << endl;
    }
    return 0;
}

解析

  • 尝试从位置20开始截取长度为10的子串,但由于字符串长度不足,会抛出out_of_range异常。
  • 输出结果为:Error: basic_string::substr。

find()的返回值校验

示例5:find()未找到子串

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

int main() {
    string s = "hello world hello everyone";
    size_t pos = s.find("test");
    if (pos == string::npos) {
        cout << "Substring not found" << endl;
    }
    return 0;
}

解析

  • 使用find()函数查找"test",由于字符串中不存在该子串,返回值为npos。
  • 输出结果为:Substring not found。

扩展阅读:npos的意义

示例6:npos的基本使用

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

int main() {
    string s = "hello world hello everyone";
    size_t pos = s.find("world");
    if (pos != string::npos) {
        string s6 = s.substr(pos);
        cout << s6 << endl;  // 输出: "world hello everyone"
    }
    return 0;
}

解析

  • 使用find()函数查找"world"的位置,如果找到则使用substr()函数从该位置截取到字符串末尾的子串。
  • 输出结果为:world hello everyone。

小结

通过本文的讲解,相信读者已经对substr()函数有了全面的了解。substr()函数在字符串处理中非常实用,但使用时需要注意边界条件,避免引发异常。同时,与其他字符串处理函数(如find())的结合使用,可以实现更复杂的字符串操作需求。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号