C++ string全面解析:从入门到精通

一、上期回顾

彻底吃透引用与指针 底层差异、const 修饰规则、传参三种方式。从今天开始正式进入 C++ STL 标准模板库 深耕,先从最常用的 string 入手。


二、为什么要用 string 替代 C 语言 char \[\]

C 语言字符数组短板:

  1. 长度固定,容易溢出
  2. 拼接、查找、截取需要手写逻辑
  3. 无法直接赋值、比较
  4. 函数传参容易退化指针、越界崩溃

C++ string 优势:

  1. 动态扩容,不用关心内存大小
  2. 自带赋值、拼接、查找、截取、替换全套接口
  3. 支持直接 + 拼接、== 比较
  4. 面向对象封装,安全不易越界

三、string 常见构造方式

复制代码
#include <iostream>
#include <string>
using namespace std;

int main()
{
    // 1. 空字符串
    string s1;

    // 2. 用字符串常量构造
    string s2("hello");

    // 3. 简化写法
    string s3 = "world";

    // 4. 拷贝构造
    string s4(s2);

    // 5. n个相同字符
    string s5(5, 'a');

    cout << s2 << endl;
    cout << s3 << endl;
    cout << s5 << endl;

    return 0;
}

四、string 赋值与拼接

1. 直接赋值

复制代码
string s;
s = "C++ STL";
s = 'A';

2. 拼接两种方式

复制代码
string a = "hello";
string b = " world";

// 方式1:+ 拼接
string c = a + b;

// 方式2:append
a.append(b);
a.append(3, '!');

五、string 常用遍历方式

复制代码
string s = "abcde";

// 1. 下标遍历
for(int i = 0; i < s.size(); i++)
{
    cout << s[i] << " ";
}

// 2. 迭代器遍历
for(string::iterator it = s.begin(); it != s.end(); it++)
{
    cout << *it << " ";
}

// 3. 范围for(C++11)
for(char ch : s)
{
    cout << ch << " ";
}

六、核心常用接口(必背)

复制代码
string s = "helloSTL";

// 1. 获取长度
s.size();
s.length();

// 2. 判断是否为空
s.empty();

// 3. 清空字符串
s.clear();

// 4. 截取子串
// pos起始位置, len长度
string sub = s.substr(0,5);

// 5. 查找字符/字符串
// 找到返回下标,没找到返回 string::npos
int pos = s.find("STL");

// 6. 替换
s.replace(0,5,"Hi");

// 7. 插入
s.insert(0,"###");

// 8. 删除
s.erase(0,3);

七、string 与 C 字符数组互转

复制代码
// string 转 char*
string s = "hello";
const char* str = s.c_str();

// char* 转 string
char arr[] = "C language";
string s2 = arr;

八、字符串比较

直接用运算符,不用 strcmp

复制代码
string a = "abc";
string b = "abd";

if(a == b) cout << "相等";
if(a < b)  cout << "a更小";

九、完整综合示例代码

复制代码
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s1 = "Hello";
    string s2 = " C++STL";

    // 拼接
    string s3 = s1 + s2;
    cout << "拼接:" << s3 << endl;

    // 长度
    cout << "长度:" << s3.size() << endl;

    // 查找
    int pos = s3.find("STL");
    if(pos != string::npos)
        cout << "STL 位置:" << pos << endl;

    // 截取
    string sub = s3.substr(0,5);
    cout << "子串:" << sub << endl;

    return 0;
}

十、今日核心总结

  1. string 替代 C 语言字符数组,动态内存、安全便捷
  2. 支持直接赋值、+ 拼接、关系运算符比较
  3. 三大遍历:下标、迭代器、范围 for
  4. 必会接口:size/empty/clear/substr/find/replace/insert/erase
  5. c_str() 实现和 C 语言字符串互转

十一、课后练习

  1. 输入一个字符串,遍历打印每个字符
  2. 查找字符串中指定字符的位置
  3. 截取前 3 个字符生成新串
相关推荐
fpcc5 小时前
c++编程实践—堆和栈越界调试
c++
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
weiabc7 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
灯澜忆梦8 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
禾小西8 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
小蒋观天下8 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J8 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛8 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有9 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111119 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode