用户_29571846
发布于 2026-06-22 / 1 阅读
0
0

C++ string 标准字符串类全套操作详解

一、前言

之前学习了 C 风格 char 字符数组,操作繁琐易乱码、越界。std::string是 C++ 标准库封装的字符串类,内置大量成员方法,支持拼接、截取、查找、替换、清空、判空等操作,是开发首选字符串类型。使用前必须引入头文件#include <string>

二、string 四种初始化方式

cpp

运行

#include <iostream>
#include <string>
using namespace std;
int main()
{
    // 1. 直接字符串赋值
    string s1 = "C++编程";
    // 2. 构造函数初始化
    string s2("学习string");
    // 3. 拷贝初始化
    string s3 = s1;
    // 4. n个重复字符初始化
    string s4(5, '*'); // "*****"
    return 0;
}

三、字符串拼接、赋值

  1. +运算符直接拼接字符串 / 字符

cpp

运行

string a = "Hello";
string b = " C++";
string c = a + b;
a += " World"; // 追加到自身
  1. append()追加函数

cpp

运行

string s = "代码";
s.append("学习");
s.append(3,'!'); // 追加3个!

四、获取长度、判空

cpp

运行

string str = "test";
str.size();  // 返回有效字符数量,等价length()
str.empty(); // 返回bool,true代表空字符串

五、字符访问

  1. 下标访问[],越界不报错,存在风险

  2. at()函数访问,下标越界抛出异常,更安全

cpp

运行

string s = "abc";
cout << s[0];
cout << s.at(1);

六、子串截取 substr

参数 1:起始下标;参数 2:截取字符个数(省略则截取到末尾)

cpp

运行

string s = "HelloWorld";
string sub1 = s.substr(0,5); // Hello
string sub2 = s.substr(5);  // World

七、查找 find /rfind

  1. find("子串"):从左向右查找,返回匹配起始下标,找不到返回string::npos

  2. rfind("子串"):从右向左反向查找

cpp

运行

string s = "I love C++, C++ easy";
size_t pos = s.find("C++");
if(pos != string::npos)
{
    cout << "找到,下标:" << pos << endl;
}

八、替换 replace

格式:replace(起始下标, 替换长度, 新字符串)

cpp

运行

string s = "abc123abc";
s.replace(0,3,"XXX"); // 把前3个字符替换为XXX

九、删除 erase、清空 clear

cpp

运行

string s = "123456";
s.erase(0,2); // 从0下标删除2个字符
s.clear();    // 清空整个字符串,长度变为0

十、字符串比较

  1. == / != / > / < 直接运算符比较,按 ASCII 码逐字符对比

  2. compare()函数,相等返回 0,大于返回正数,小于返回负数

cpp

运行

string a = "apple", b = "banana";
if(a < b) cout << "a更小";

十一、读取带空格整行 getline

cin 读取遇到空格自动截断,读取完整带空格文本使用getline(cin,字符串)

cpp

运行

string msg;
cout << "输入一段带空格文字:";
getline(cin, msg);
cout << msg;

十二、新手易错点

  1. 忘记引入<string>头文件,编译报错

  2. find 判断不用string::npos,直接判断 pos==-1(部分环境不兼容)

  3. 下标超出字符串长度,[]无报错但内存乱码,优先使用 at ()

  4. cin 读取后残留换行符,导致后续 getline 读取空行

十三、综合实战:关键词过滤替换工具

cpp

运行

#include <iostream>
#include <string>
using namespace std;
// 敏感词替换为*
void filterWord(string &text, string badWord)
{
    size_t pos = 0;
    while((pos = text.find(badWord, pos)) != string::npos)
    {
        text.replace(pos, badWord.size(), string(badWord.size(), '*'));
        pos += badWord.size();
    }
}
int main()
{
    string content;
    cout << "输入文本:";
    getline(cin, content);
    filterWord(content, "垃圾");
    filterWord(content, "违规");
    cout << "过滤后文本:" << content << endl;
    return 0;
}

十四、下期预告

下一篇:C++ 文件流 fstream 读写本地 txt 文档完整教程


评论