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

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

原创
作者头像
杨校
发布2025-07-05 17:44:04
发布2025-07-05 17:44:04
23600
代码可运行
举报
文章被收录于专栏: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. 达达的日记1

题目描述

达达想要统计一下电子版的日记已经写了多少字,请你帮助他解决问题。

输入描述

输入一行,一个字符串,字符串中可能包含空格。

输出描述

输出一行,一个整数,表示字符串所包含字符的个数。

样例输入

Today is a very beautiful day.

样例输出

30

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

using namespace std;

int main(){
  // 定义变量
  string str;
  // 获取
  getline(cin,str);
  // 输出
  cout << str.size();

  return 0;
}

2. 字符统计

题目描述

输入一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成),分别统计出其中大写英文字母,小写英文字母、阿拉伯数字和空格的个数。

输入描述

一行字符串(字符串长度小于10000,由大小写字母、阿拉伯数字和空格组成)

输出描述

分别输出大写英文字母,小写英文字母、阿拉伯数字和空格的个数,用空格隔开

样例

输入

h0u84nfx 7

输出

0 5 4 1

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>
#include <string>
#include <cstdio>

using namespace std;

int main(){

  string str;
  int x_cnt=0,d_cnt=0,n_cnt=0;
  
  getline(cin,str);
  
  int len =  str.size();
  
  for (int i = 0; i < len; i++) {
      if(str[i]>='a'&& str[i]<='z'){
        x_cnt++;
      }
      else if(str[i]>='A'&& str[i]<='Z'){
        d_cnt++;
      }
      else if(str[i]>='0'&& str[i]<='9'){
        n_cnt++;
      }
  }
  printf("%d %d %d %d",d_cnt , x_cnt , n_cnt , len-(x_cnt+d_cnt+n_cnt));
  

  return 0;
}

3. 达达的日记2

题目描述

达达在写日记的过程中突然发现自己漏写了一段,很是着急。但是聪明的你知道可以借助插入的方法将达达漏写的一部分内容补充到应该进行填充的位置,请你帮助达达解决这个问题。

输入描述

输入共三行,第一行一个字符串,表示达达已经写好的内容。

第二行一个整数,表示内容的插入位置;

第三行一个字符串,表示要插入的内容

输出描述

输出一行,一个字符串,表示插入后的内容。

样例输入

TodayMonday.

5

is

样例输出

TodayisMonday.

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

using namespace std;

int main(){
    
    string str,s,str1,str2;
    int n,m;
    cin >> str;
    cin >> n ;
    cin >> s;
    str2 = str.substr(n);
    str1 = str.substr(0,n);
 
    str1.append(s);
    str1.append(str2);
    
    cout << str1;
    
  return 0;
}

4. 达达的日记3

题目描述

随着打字熟练度越来越高,达达笔记记录的速度越来越快,但是速度快的代价就是容易出现写错的情况,现在达达已经将写错的内容找到了,请你帮助他删除写错部分的内容。

输入描述

输入共两行,第一行一个字符串,表示达达迅速写完的内容;

第二行两个整数,分别表示写错内容的起始位置以及写错内容的长度

输出描述

输出一行,一个字符串,表示删除错误内容之后的内容。

样例输入

TodayissssSaturday.

7 3

样例输出

TodayisSaturday.

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

using namespace std;

int main(){
    
    string str;
    int n,m;
    cin >> str;
    cin >> n >> m;
    cout << str.erase(n,m);
    
  return 0;
}

5. 规范单词

题目描述

我们把一个以er、ly或者ing作为最后字母的单词称为不规范单词,对于这种不规范的单词我们需要将后缀部分删除掉进行规范输出,现请你写一程序进行规范输出。

输入描述

输入一行,包含一个单词(单词中间没有空格,每个单词最大长度为32)。

输出描述

输出按照题目要求处理后的单词。

样例

输入

referer

输出

refer

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

using namespace std;

int main(){
    
    string str;
    cin >> str;
    
    int len = str.length(); 
    // 检查以"er"结尾的情况
    if(len > 2 && str.substr(len-2)=="er"){
            //去除该后缀
              str = str.substr(0, len - 2);
     // 检查以"ly"结尾的情况
        }else  if(len > 2 && str.substr(len-2)=="ly"){
                // 去除该后缀
              str = str.substr(0, len - 2);
    // 检查以"ing"结尾的情况
        }else  if(len > 3 && str.substr(len-3)=="ing"){
                // 去除该后缀
              str = str.substr(0, len - 3);
        }
       
    cout << str<< endl;
    
    return 0;
}

6. 达达的日记4

题目描述

由于部分日记的内容是存在重复的,因此达达想要将重复的内容截取出来便于接下来写日记的时候重复使用,请你解决截取的问题。

输入描述

输入共两行,第一行一个字符串,表示日记内容;

第二行两个整数,分别表示截取内容的起始位置以及截取内容的长度

输出描述

输出一行,一个字符串,表示截取出的子串内容。

样例输入

I had a fun day.

8 7

样例输出

fun day

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

using namespace std;

int main(){
    
    string str,str1,str2;
    int n,m;
    getline(cin,str);
    cin >> n>>m;

    str1 = str.substr(n,m);
 
    cout << str1;
    
  return 0;
}

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

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

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

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

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