#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