火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

C++ string 字符串笔记

作者: 作者的头像   刘杰 , 时间:2026-06-14 10:09:34 , 所有人可见, 阅读  31

C++ String 字符串详解笔记


一、基本概念

C++ 中的 string 是标准库提供的字符串类,位于 <string> 头文件中,比 C 风格字符数组更安全、更实用。

#include <string>
using namespace std;

二、定义与初始化

string s1;              // 空字符串
string s2 = "Hello";    // C风格字符串初始化
string s3("World");     // 构造函数初始化
string s4(5, 'A');      // 5个'A',即"AAAAA"
string s5 = s2;         // 拷贝初始化
string s6 = s2 + " " + s3; // 拼接初始化

三、常用成员函数

3.1 获取长度与判空

string s = "Hello";
s.size();      // 返回长度 5 (推荐)
s.length();    // 返回长度 5 (与size()等价)
s.empty();     // 判空,返回bool
s.clear();     // 清空字符串

3.2 访问字符

string s = "Hello";
s[0];          // 'H',不检查越界
s.at(0);       // 'H',检查越界,抛出out_of_range异常
s.front();     // 'H',首字符
s.back();      // 'o',尾字符

3.3 截取子串

string s = "Hello World";
s.substr(6);      // "World",从位置6到末尾
s.substr(0, 5);   // "Hello",从位置0开始,长度5
s.substr(6, 3);   // "Wor",从位置6开始,长度3

3.4 查找

string s = "Hello World";
s.find("World");          // 6,首次出现位置
s.find("xyz");            // string::npos,未找到
s.find('o');              // 4,首次出现位置
s.find('o', 5);           // 7,从位置5开始找
s.rfind('o');             // 7,从后往前找

// 判断是否找到
if (s.find("World") != string::npos) {
    // 找到了
}

3.5 替换与插入

string s = "Hello World";
s.insert(5, ",");         // "Hello, World"
s.replace(6, 5, "C++");   // "Hello, C++"
s.erase(5, 2);            // 删除从位置5开始的2个字符
s.push_back('!');         // 末尾添加字符
s.pop_back();             // 删除末尾字符
s.append("!!!");          // 末尾追加字符串

3.6 比较

string a = "abc";
string b = "abd";
a == b;     // false
a != b;     // true
a < b;      // true (字典序比较)
a.compare(b); // 负数(a<b),0(相等),正数(a>b)

四、输入输出

4.1 cin 与 cout

string s;
cin >> s;           // 读入单词(遇空格停止)
cout << s << endl;  // 输出

4.2 getline

string s;
getline(cin, s);                // 读入整行(含空格)
getline(cin, s, ',');           // 以逗号为分隔符读入

注意:cin >> n 后用 getline,需要先 getchar() 或 cin.ignore() 消耗换行符。


五、类型转换

5.1 字符串转数字

string s = "123";
int a = stoi(s);           // 123
long long b = stoll(s);    // 123
double c = stod("3.14");   // 3.14

5.2 数字转字符串

string s1 = to_string(123);      // "123"
string s2 = to_string(3.14);     // "3.14"

六、遍历字符串

string s = "Hello";

// 方式1:下标遍历
for (int i = 0; i < s.size(); ++i)
    cout << s[i];

// 方式2:范围for
for (char c : s)
    cout << c;

// 方式3:修改字符
for (char& c : s)
    c = toupper(c);  // 转大写

七、常用字符函数

#include <cctype>

isalpha(c);  // 是否字母
isdigit(c);  // 是否数字
isalnum(c);  // 是否字母或数字
isupper(c);  // 是否大写
islower(c);  // 是否小写
toupper(c);  // 转大写
tolower(c);  // 转小写

八、函数参数传递

8.1 值传递(拷贝)

void func(string s) {  // s是副本,修改不影响原串
    s += " World";
}

8.2 引用传递(可修改)

void func(string& s) {  // s是原串的引用
    s += " World";      // 修改会影响原串
}

8.3 const 引用传递(推荐,高效且安全)

void func(const string& s) {  // 不能修改,不拷贝
    cout << s.size();
}

建议: - 只读时用 const string& - 需要修改时用 string& - 确实需要副本时用 string(值传递)


九、函数返回值

9.1 返回值(推荐)

string greet(string name) {
    return "Hello, " + name;
}

9.2 返回引用(谨慎使用)

string& getRef(string& s) {
    return s;  // 返回引用,不能返回局部变量的引用!
}

注意:不要返回局部变量的引用,会导致未定义行为。


十、常见 OI 技巧

10.1 分割字符串

// 以空格分割
stringstream ss("Hello World Foo");
string word;
while (ss >> word)
    cout << word << endl;

// 以指定字符分割
string s = "a,b,c,d";
stringstream ss(s);
string token;
while (getline(ss, token, ','))
    cout << token << endl;

10.2 字符串拼接

string s;
s += "Hello";
s += ' ';
s += "World";
// 或
string result = s1 + " " + s2;

10.3 字符串与字符数组转换

// string -> char*
string s = "Hello";
const char* p = s.c_str();

// char* -> string
char arr[] = "World";
string s2(arr);

十一、完整示例

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    getline(cin, s);  // 读入含空格的字符串

    // 统计单词个数
    stringstream ss(s);
    string word;
    int cnt = 0;
    while (ss >> word)
        cnt++;

    cout << "单词数: " << cnt << endl;
    cout << "字符串长度: " << s.size() << endl;

    // 查找替换
    int pos = s.find("World");
    if (pos != string::npos)
        s.replace(pos, 5, "C++");

    cout << "替换后: " << s << endl;

    return 0;
}

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码