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