#GOC128818. 字符串知识点
字符串知识点
题目描述
C++字符串详解课堂笔记
一、字符串基础概念
1. 定义:string 是C++中的一种引用数据类型,本质上是字符数组
2. 与字符的区别:
1. 字符串:用双引号包裹,如 "hello"
2. 字符:用单引号包裹,如 'a'
3. 数据类型分类:
1. 基本数据类型:int、char、double等(共8种)
2. 引用数据类型:string、struct等
二、字符串输入方法
· 普通输入:cin >> s(不能读取带空格的字符串)
· 带空格输入:getline(cin, s)(可以读取包含空格的完整字符串)
三、常用字符串函数
1. 长度函数 size()
功能:返回字符串的长度(包含的字符个数)
string s = "123abc";
cout << s.size(); // 输出:6(因为包含6个字符)
2. 查找函数 find()
功能:查找指定内容在字符串中的位置
string s = "123abc";
cout << s.find('a'); // 输出:3(字符'a'在下标3的位置)
cout << s.find("bc"); // 输出:4(子串"bc"从下标4开始)
cout << s.find("3b"); // 输出:-1(找不到该子串)
进阶用法:指定起始查找位置
string s = "123abc123abc123";
cout << s.find("12", 10); // 从下标10开始查找"12"
应用:统计子串出现次数
string s = "ab1ababababab"; // 查找"ab"出现次数
int xb = 0, sum = 0;// sum记录查找成功的次数
while (s.find("ab", xb) != -1) {
sum++;
xb = s.find("ab", xb) + 1; // 从下一个位置继续查找
}
cout << sum; // 输出:6
3. 删除函数 erase()
功能:删除字符串中的指定部分
// 语法:s.erase(开始删除的下标, 删除的长度)
string s = "123abc";
s.erase(2, 2); // 从下标2开始,删除2个字符
cout << s; // 输出:"12bc"
应用1:去除特定字符(如去除所有小写字母'a')
string s = "123abaaaaacawd...";
while (s.find("a") != -1) {
s.erase(s.find("a"), 1); // 找到'a'就删除
}
cout << s;
应用2:去除所有小写字母
方法一:筛选法
string s = "123abca...", s2;
for (int i = 0; i < s.size(); i++) {
if (s[i] < 'a' || s[i] > 'z') { // 判断是否不是小写字母
s2 += s[i]; // 保留非小写字母字符
}
}
cout << s2;
方法二:逐一删除法
string s = "123abca...";
for (char c = 'a'; c <= 'z'; c++) { // 遍历所有小写字母
while (s.find(c) != -1) {
s.erase(s.find(c), 1); // 删除找到的字符
}
}
cout << s;
4. 截取函数 substr()
功能:截取字符串的一部分(不会改变原字符串)
// 语法:s.substr(开始截取的下标, 截取的长度)
string s = "123abc";
string sub = s.substr(2, 2); // 从下标2开始,截取2个字符
cout << sub; // 输出:"3a"
cout << s; // 输出:"123abc"(原字符串不变)
string sub=s.substr(3)//从下标3开始截取后面全部字符
5. 插入函数 insert()
功能:在指定位置插入内容
// 语法:s.insert(插入的下标, 插入的内容)// 注意:插入到指定下标的前面
string s = "123abc";
s.insert(2, "xy"); // 在下标2的位置前插入"xy"
cout << s; // 输出:"12xy3abc"
6.反转字符串(reverse)
string s = "hello";//反转全部元素
reverse(s.begin(), s.end());
cout << s << endl; // 输出: olleh
string s1=”agdfasdfa”
// 反转前4个元素
reverse(v.begin(), v.begin() + 4);
// 反转下标2到5的元素
reverse(v.begin() + 2, v.begin() + 6);
7.一些常见的判断方法
判断字符c是否是大写if(isupper(c));
判断字符c是否是小写if(islower(c));
判断字符c是否是数字if(isdigit(c))
判断字符c是否是空格if(isspace(c))
四、字符串表达式处理实例
问题:计算逗号分隔的数字字符串的总和(如"123,123,1,2,2,2,31")
解决方法:
string s = "123,123,1,2,2,2,31";
s += ","; // 在末尾添加一个逗号,确保最后一个数字能被处理int sum = 0, a = 0;
while (s.find(",") != -1) {
int xb = s.find(","); // 找到逗号的位置
// 将逗号前的字符串转换为数字
for (int i = 0; i < xb; i++) {
a = a * 10 + s[i] - '0'; // 字符转数字的方法
}
sum += a; // 累加数字
s.erase(0, xb + 1); // 删除已处理的部分(包括逗号)
a = 0; // 重置临时变量
}
cout << sum; // 输出总和
五、学习建议
1. 理解本质:字符串本质是字符数组,可以像操作数组一样操作字符串
2. 函数记忆:重点掌握size()、find()、erase()、substr()、insert()五个核心函数
3. 多做练习:通过处理实际问题(如字符串分割、查找、替换)加深理解
4. 注意细节:字符串下标从0开始,find()函数找不到内容时返回-1