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 个字符生成新串
相关推荐
无忧.芙桃2 小时前
现代C++讲解之变量模板,泛型lambda,函数返回类型推导的使用
开发语言·c++·visualstudio
码农的神经元2 小时前
拆解 SDGT 算法:图神经网络 + Transformer 如何做短期电力负荷预测
神经网络·算法·transformer
郝学胜-神的一滴2 小时前
[简化版 GAMES 101] 计算机图形学 07:图形学投影完全推导
c++·unity·图形渲染·three.js·unreal engine
zh_xuan2 小时前
api调试工具增加支持输入请求头
c++·libcurl
Irissgwe2 小时前
算法之滑动窗口
数据结构·算法
纽扣6672 小时前
【算法进阶之路】链表核心:快慢指针与反转链表专题精讲
数据结构·c++·算法·链表
lzh200409192 小时前
Linux管道(Pipe)深度指南:从原理到实战
linux·c++
eDEs OLDE2 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
浅念-2 小时前
吃透栈:LeetCode 栈算法题全解析
数据结构·c++·算法·leetcode·职场和发展·