首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >杨校老师课堂之字符串——string相关函数方法(二)

杨校老师课堂之字符串——string相关函数方法(二)

原创
作者头像
杨校
发布2025-07-05 17:49:02
发布2025-07-05 17:49:02
17000
代码可运行
举报
文章被收录于专栏:C++信息学奥赛C++信息学奥赛
运行总次数:0
代码可运行

一、知识重点

C++ string 类的常用函数及相关工具的详细总结,按功能分类整理,附代码示例:

(一)字符串基础操作

函数

功能描述

示例代码

s.length()

返回字符串长度(字符数)

string s = "hello"; cout << s.length(); // 输出 5

s.empty()

判断字符串是否为空(等价于 s.length() == 0)

if (s.empty()) { ... }

s.clear()

清空字符串内容

s.clear(); // s 变为 ""

s.resize(n, c)

调整字符串长度为 n,新增字符用 c 填充(默认补 '\0')

s.resize(10, 'x'); // "hello" → "helloxxxxx"

(二)字符串修改操作

函数

功能描述

示例代码

s += t

字符串拼接(追加 t 到 s 末尾)

s += "world"; // "hello" → "helloworld"

s.append(t)

同 +=,支持追加子串(如 s.append(t, pos, len))

s.append("123", 1, 2); // 追加 "23"

s.push_back(c)

在字符串末尾添加单个字符 c

s.push_back('!'); // "hello" → "hello!"

s.pop_back()

删除字符串末尾的字符(C++11 起支持)

s.pop_back(); // "hello" → "hell"

s.insert(pos, t)

在位置 pos 插入字符串 t

s.insert(2, "xx"); // "hello" → "hexxllo"

s.erase(pos, len)

从位置 pos 开始删除 len 个字符(默认删到末尾)

s.erase(1, 2); // "hello" → "hlo"

s.replace(pos, len, t)

从位置 pos 开始的 len 个字符替换为 t

s.replace(1, 3, "XX"); // "hello" → "hXXo"

(三)字符串查找与比较

函数

功能描述

示例代码

s.find(t, pos)

从位置 pos 开始查找子串 t,返回首次出现的位置;未找到返回 string::npos

size_t idx = s.find("ll"); // 2

s.rfind(t, pos)

从位置 pos 开始反向查找子串 t,返回最后一次出现的位置

s.rfind("l"); // 3

s.substr(pos, len)

截取从位置 pos 开始的 len 个字符(默认到末尾)

string sub = s.substr(1, 3); // "ell"

s.compare(t)

字符串比较(字典序):0 相等,负数 s < t,正数 s > t

s.compare("hello"); // 0

s == t / s != t

直接比较字符串是否相等(推荐,更直观)

if (s == "hello") { ... }

(四)字符串迭代与遍历

函数

功能描述

示例代码

s.begin()

返回指向字符串首字符的迭代器

for (auto it = s.begin(); it != s.end(); ++it) { cout << *it; }

s.end()

返回指向字符串尾字符后一位的迭代器(空终止符 '\0' 之后)

// 配合 begin() 使用

s.rbegin()

返回反向迭代器,指向最后一个字符

for (auto rit = s.rbegin(); rit != s.rend(); ++rit) { ... }

s.rend()

返回反向迭代器,指向第一个字符前一位

// 用于逆序遍历

s[i]

随机访问第 i 个字符(下标从 0 开始),不检查越界

cout << s[2]; // 输出 'l'

s.at(i)

同 s[i],但会检查越界(越界时抛出 out_of_range 异常)

try { cout << s.at(10); } catch (const exception& e) { ... }

(五)字符串与数值的转换

函数

功能描述

示例代码

stoi(s, pos, base)

将字符串 s 转换为 int 类型,pos 存储转换后的位置,base 为进制(默认 10)

int num = stoi("123"); // 123

stol(s) / stoll(s)

转换为 long / long long 类型

long num = stol("1234567890");

stof(s) / stod(s)

转换为 float / double 类型

double d = stod("3.14");

to_string(num)

将数值(如 int、double)转换为字符串

string s = to_string(123.45); // "123.450000"

(六)字符串大小写转换

函数

功能描述

示例代码

tolower(c)

将字符 c 转为小写(需包含 <cctype>)

char c = tolower('A'); // 'a'

toupper(c)

将字符 c 转为大写

char c = toupper('b'); // 'B'

批量转换

结合 transform 和迭代器实现

transform(s.begin(), s.end(), s.begin(), ::tolower); // 全转小写

(七)字符串分割与处理(需配合其他工具)

工具

功能描述

示例代码

stringstream

字符串流,用于分割字符串(按空格、逗号等)

string s = "hello world"; stringstream ss(s); string word; while (ss >> word) { ... }

getline(cin, s)

读取一行输入(包含空格),存入字符串 s

string s; getline(cin, s); // 输入 "a b c" → s = "a b c"

regex(正则表达式)

复杂字符串匹配与替换(需包含 <regex>)

regex pattern("\\d+"); string s = regex_replace("a1b2c3", pattern, "X"); // "aXbXcX"

(八)注意事项

  1. 字符串长度与空终止符
  • s.length() 返回的是可见字符数,不包含字符串末尾的 '\0'(C++ 的 string 会自动管理 '\0')。

二、专项训练

  1. 文字处理软件

题目描述

你需要开发一款文字处理软件。最开始时输入一个字符串(不超过 100 个字符)作为初始文档。可以认为文档开头是第 0 个字符。需要支持以下操作:

• 1 str:后接插入,在文档后面插入字符串 str,并输出文档的字符串。

• 2 a b:截取文档部分,只保留文档中从第 a 个字符起 b 个字符,并输出文档的字符串。

• 3 a str:插入片段,在文档中第 a 个字符前面插入字符串 str,并输出文档的字符串。

• 4 str:查找子串,查找字符串 str 在文档中最先的位置并输出;如果找不到输出 -1。

为了简化问题,规定初始的文档和每次操作中的 str 都不含有空格或换行。最多会有q(q≤100) 次操作。

输入描述

输入q+1行,

第一行一个正整数q;

接下来q行,每行一条指令

输出描述

样例

输入

4

ILove

1 Coduck

2 5 5

3 3 duckDuckduck

4 duck

输出

ILoveCoduck

Coduc

CodduckDuckduckuc

3

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <string>  // 引入string类库,支持字符串操作
using namespace std;

int main() {
    int q;  // 存储查询(操作)的次数
    cin >> q;  // 输入操作次数
    
    string document;  // 定义字符串变量,用于存储文档内容
    cin >> document;  // 输入初始文档内容
    
    // 循环处理q次操作(q--:每次循环后q减1,直到q=0结束)
    while (q--) {
        int op;  // 存储当前操作的编号(1-4)
        cin >> op;  // 输入操作编号
        
        // 根据操作编号执行不同逻辑
        switch (op) {
            // 操作1:在文档末尾追加字符串
            case 1: {
                string str;  // 存储要追加的字符串
                cin >> str;  // 输入要追加的内容
                document += str;  // 将str追加到document末尾(字符串拼接)
                cout << document << endl;  // 输出更新后的文档
                break;  // 跳出当前case,执行下一次循环
            }
            
            // 操作2:截取文档的子串(从位置a开始,长度为b)
            case 2: {
                int a, b;  // a:起始位置;b:截取长度
                cin >> a >> b;  // 输入起始位置和长度
                // 调用substr(a, b)截取子串,并赋值给document(覆盖原内容)
                document = document.substr(a, b);
                cout << document << endl;  // 输出截取后的文档
                break;
            }
            
            // 操作3:在文档指定位置插入字符串
            case 3: {
                int a;  // 插入位置(从0开始)
                string str;  // 要插入的字符串
                cin >> a >> str;  // 输入插入位置和字符串
                // 拼接三部分:原文档[0,a) + 插入的str + 原文档[a,末尾)
                document = document.substr(0, a) + str + document.substr(a);
                cout << document << endl;  // 输出插入后的文档
                break;
            }
            
            // 操作4:查找子串在文档中首次出现的位置
            case 4: {
                string str;  // 要查找的子串
                cin >> str;  // 输入目标子串
                // 调用find(str)查找子串,返回首次出现的起始位置;未找到返回string::npos
                size_t found = document.find(str);
                if (found != string::npos) {  // 找到子串
                    cout << found << endl;  // 输出位置
                } else {  // 未找到子串
                    cout << "-1" << endl;  // 输出-1
                }
                break;
            }
        }
    }
    return 0;  // 程序正常结束
}
  1. 修改字符

题目描述

现在有一处输入错误的字符串,我们需要用我们指定的字符来替换掉这个字符串中所有写错的字符,得到一个新的字符串。

输入描述

只有一行,由一个字符串和两个字符组成,中间用单个空格隔开。字符串是待替换的字符串,字符串长度小于等于30个字符,且不含空格等空白符;

接下来一个字符为需要被替换的特定字符;

接下来一个字符为用于替换的给定字符。

输出描述

一行,即替换后的字符串。

样例

输入

hello-how-are-you o O

输出

hellO-hOw-are-yOu

方案一:

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    // 定义变量并输入存放好
    string s, s1, s2;
    cin >> s >> s1 >> s2;

    // 只要字符串中还存在需要被替换的子串
    while (s.find(s1)!= -1) {
        // 找出位置并进行替换
        int pos = s.find(s1);
        s.replace(pos, 1, s2);
    }

    // 输出修改后的字符串
    cout << s << endl;
    return 0;
}

方案二:

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <string>
using namespace std;
int main(){

    string str,str1,str2;
    char c1,c2;
    
    cin >> str >> str1 >> str2;
    int len = str.size();
    // cout <<len;
    for(int i=0;i<len;i++){
        if(str[i]==str1[0])
        str[i] = str2[0];
    }
    
    cout << str;
    

  return 0;
}

方案三:

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <string>
using namespace std;
int main(){

    string str;
    char c1,c2;
    
    cin >> str >> c1 >> c2;
    int len = str.size();
    // cout <<len;
    for(int i=0;i<len;i++){
        if(str[i]==c1)
        str[i] = c2;
    }
    
    cout << str;
    

  return 0;
}
  1. 统计字符个数

题目描述

输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

这行字符的长度不超过500。

输入描述

输入一行,若干个字符

输出描述

输出一行,分别为字母、数字、空格以及其它字符的个数,中间用空格隔开。

样例

输入

aklsjflj123 sadf918u324 asdf91u32oasdf/.';123

输出

23 16 2 4

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <string>
using namespace std;

int main() {
    string input;
    getline(cin, input);  // 读取输入的一行字符

    int letter_count = 0;  // 英文字母个数
    int digit_count = 0;   // 数字个数
    int space_count = 0;   // 空格个数
    int other_count = 0;   // 其他字符个数

    for (size_t i = 0; i < input.size(); ++i) {
        if (isalpha(input[i])) {  // 判断是否是英文字母
            letter_count++;
        } else if (isdigit(input[i])) {  // 判断是否是数字
            digit_count++;
        } else if (input[i] == ' ') {  // 判断是否是空格
            space_count++;
        } else {
            other_count++;
        }
    }

    cout << letter_count << " " << digit_count << " " << space_count << " " << other_count << endl;
    return 0;
}
  1. 大小写字母互换

题目描述

把一个字符串中所有出现的大写字母都替换成小写字母,同时把小写字母替换成大写字母。

输入描述

输入一行:待互换的字符串。

输出描述

输出一行:完成互换的字符串(字符串长度小于80)。

样例

输入

If so, you already have a Google Account. You can sign in on the right.

输出

iF SO, YOU ALREADY HAVE A gOOGLE aCCOUNT. yOU CAN SIGN IN ON THE RIGHT.

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <cctype>
#include <string>
using namespace std;

int main() {
    string str;
    getline(cin, str);  // 读取输入的字符串

    for (int i = 0; i < str.size(); ++i) {
        if (isupper(str[i])) {  // 如果是大写字母
            str[i] = tolower(str[i]);  // 转换为小写字母
        } else if (islower(str[i])) {  // 如果是小写字母
            str[i] = toupper(str[i]);  // 转换为大写字母
        }
    }

    cout << str << endl;
    return 0;
}
  1. 达达家的小卖部

题目描述

达达家有个小卖部,每当放学之后会有很多小伙伴到他家买东西。细心的达达发现每次有小伙伴们来购物的时候会在找商品的环节上花费很多时间,原来是达达的爸爸进完货之后会随意将商品摆放在一个位置,这就造成小伙伴们会花费较多的时间找商品。现在小可想将商品按照字典序从小到大的顺序将商品排好顺序,但是由于商品较多,整理顺序会花费相当长的时间,请你帮助小可写一个程序将所有的商品排好顺序。

输入描述

输入包含n+1行。

第一行一个正整数n,表示商品的数量;

接下来n行,每行一个字符串,表示商品名,字符串长度不超过50且不包含空格。

输出描述

输出一行,n个商品名,商品名之间用两个空格隔开。

输入样例

3

water

apple

chocolate

输出样例

apple chocolate water

数据范围 1<=N<=200

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <cstring>
using namespace std;

// 交换两个字符串
void swap(char arr[][51], int i, int j) {
    char temp[51];
    strcpy(temp, arr[i]);
    strcpy(arr[i], arr[j]);
    strcpy(arr[j], temp);
}

// 冒泡排序实现字符串按字典序排序
void bubbleSort(char arr[][51], int n) {
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < n - i - 1; ++j) {
            if (strcmp(arr[j], arr[j + 1]) > 0) {
                swap(arr, j, j + 1);
            }
        }
    }
}

int main() {
    int n;
    cin >> n;
    char goods[200][51];  // 二维字符数组存储商品名,假设最多200个商品,每个商品名长度不超50
    for (int i = 0; i < n; ++i) {
        cin >> goods[i];
    }

    bubbleSort(goods, n);

    for (int i = 0; i < n; ++i) {
        cout << goods[i];
        if (i < n - 1) {
            cout << "  ";
        }
    }
    cout << endl;
    return 0;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、知识重点
    • (一)字符串基础操作
    • (二)字符串修改操作
    • (三)字符串查找与比较
    • (四)字符串迭代与遍历
    • (五)字符串与数值的转换
    • (六)字符串大小写转换
    • (七)字符串分割与处理(需配合其他工具)
    • (八)注意事项
  • 二、专项训练
    • 题目描述
    • 输入描述
    • 样例
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档