深入理解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())的结合使用,可以实现更复杂的字符串操作需求。
热门推荐
房产证遗失怎么办?补办流程及注意事项
区块链的加密技术
印度低种姓人为什么不能冒充高种姓人?他们之间差别有多大?
房颤需要应该怎么治疗
小腿痛、小腿內側緊蹦,夾脛症多久會好?
民航科普:旅客误机后该怎么办
非人哉:敖烈吃掉唐三藏的白马,大战孙悟空,观音将他变成白龙马
为什么多晒太阳心情会变好?建议每天晒晒太阳
老年猫吃什么猫粮比较好?
《黄雀》香港演员演技出众,姜大卫压迫感十足,王浩信演绎精彩配角
销售额超15亿全网“杀疯”,《黑神话:悟空》“造神”成功了?
IGN 十佳《怪物猎人》游戏盘点
皮肤也会“过敏”?学会如何应对过敏性皮炎!
到底是弹夹还是弹匣?一文读懂枪械供弹装置
老祖宗这十句古训,句句震撼,深刻睿智,人生阅历的总结,道尽世间万象与处世真谛!
斐波那契数列的动态规划算法设计与分析
数字和字母组合的网名(共102个)
2024个人所得税税率表(综合所得适用)
好好疼爱里面动漫:这部作品如何探讨情感的复杂与成长的力量
头痛总整理:头痛类型、头痛原因、头痛舒缓及预防头痛的方法
揭秘黑洞:为什么连光速也无法逃脱?
川贝有假的吗 川贝有毒性吗
计算机网络基础教程:有线传输媒体和无线传输媒体
各国都头疼的核废料:我国每年有3500吨核废料,如何解决这大麻烦
职业资格证书的用途有哪些?
林-曼纽尔·米兰达在《汉密尔顿》音乐剧中的创作浅析
脸上长白色小籽籽怎么办?四种有效去除方法
耳部折痕解决方案全攻略
国产车与合资车质量差距到底有多大?资深修理工告诉你答案!
多菌灵浇花的正确使用方法(保护花卉健康,远离病虫害)