C++字符串知识点详解
编程小白的终极指南 – 用大白话理解C++字符串处理
📚 C++字符串基础知识
C++中有两种主要的字符串表示方式:C风格字符串(字符数组)和C++ string类。理解这两者的区别是掌握C++字符串处理的关键。
C风格字符串
- 本质是字符数组(char数组)
- 以特殊字符’\0’(空字符)结尾
- 需要手动管理内存
- 使用C标准库函数操作(如strcpy, strlen等)
- 容易出错,但更底层,效率高
char str1[10] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}; // 手动添加结束符
char str2[] = “World”; // 自动添加结束符
// 使用C字符串函数
#include <cstring>
int len = strlen(str1); // 计算长度
strcat(str1, str2); // 连接字符串
char str2[] = “World”; // 自动添加结束符
// 使用C字符串函数
#include <cstring>
int len = strlen(str1); // 计算长度
strcat(str1, str2); // 连接字符串
C++ string类
- C++标准库提供的字符串类
- 自动管理内存,无需担心内存分配
- 提供丰富的成员函数
- 更安全、更易用
- 需要包含<string>头文件
#include <string>
// 创建string对象
string s1 = “Hello”;
string s2(“World”);
string s3(5, ‘A’); // “AAAAA”
// 基本操作
s1 += ” “ + s2; // 连接字符串
int len = s1.length(); // 获取长度
// 创建string对象
string s1 = “Hello”;
string s2(“World”);
string s3(5, ‘A’); // “AAAAA”
// 基本操作
s1 += ” “ + s2; // 连接字符串
int len = s1.length(); // 获取长度
重要提示: 对于C++初学者,建议优先使用string类,它更安全、更方便。C风格字符串容易导致缓冲区溢出等安全问题,需要谨慎使用。
🔍 string类的常用操作
字符串的创建与初始化
- 默认初始化: string str; // 空字符串
- C字符串初始化: string str(“Hello”);
- 复制构造函数: string str1(str2);
- 部分复制: string str(“Hello”, 3); // “Hel”
- 重复字符: string str(5, ‘A’); // “AAAAA”
字符串的输入输出
- 输入: cin >> str; // 读取一个单词
- 整行输入: getline(cin, str); // 读取整行
- 输出: cout << str;
- 文件输入输出: 使用ifstream/ofstream类似
string name;
cout << “请输入您的姓名: “;
getline(cin, name); // 读取整行
cout << “你好, “ << name << “!” << endl;
cout << “请输入您的姓名: “;
getline(cin, name); // 读取整行
cout << “你好, “ << name << “!” << endl;
访问字符串内容
- 下标访问: char c = str[0]; // 第一个字符
- at()函数: char c = str.at(0); // 带边界检查
- front()/back(): 访问首尾字符
- c_str(): 获取C风格字符串指针
string s = “Hello”;
for (int i = 0; i < s.length(); i++) {
cout << s[i] << ” “; // H e l l o
}
// 使用迭代器
for (auto it = s.begin(); it != s.end(); it++) {
cout << *it;
}
for (int i = 0; i < s.length(); i++) {
cout << s[i] << ” “; // H e l l o
}
// 使用迭代器
for (auto it = s.begin(); it != s.end(); it++) {
cout << *it;
}
字符串修改操作
- 追加: str.append(“abc”); 或 str += “abc”;
- 插入: str.insert(3, “abc”);
- 删除: str.erase(3, 2); // 从位置3删除2个字符
- 替换: str.replace(2, 3, “abc”);
- 清空: str.clear();
string s = “Hello”;
s.append(” World”); // “Hello World”
s.insert(5, “, C++”); // “Hello, C++ World”
s.erase(10, 6); // “Hello, C++”
s.replace(7, 3, “11”); // “Hello, C11”
s.append(” World”); // “Hello World”
s.insert(5, “, C++”); // “Hello, C++ World”
s.erase(10, 6); // “Hello, C++”
s.replace(7, 3, “11”); // “Hello, C11”
字符串比较与查找
- 比较: ==, !=, <, >, <=, >= 或 str.compare()
- 查找: str.find(“abc”) // 返回首次出现位置
- 反向查找: str.rfind(“abc”)
- 查找字符: str.find_first_of(“abc”)
- 未找到: 返回string::npos
string s = “Hello World”;
// 比较
if (s == “Hello World”) { … }
// 查找
size_t pos = s.find(“World”); // 6
pos = s.find(“abc”); // string::npos
pos = s.find_first_of(“aeiou”); // 1 (e)
// 比较
if (s == “Hello World”) { … }
// 查找
size_t pos = s.find(“World”); // 6
pos = s.find(“abc”); // string::npos
pos = s.find_first_of(“aeiou”); // 1 (e)
字符串与数值转换
- 转整数: int i = stoi(str);
- 转浮点数: double d = stod(str);
- 数值转字符串: string s = to_string(123);
- C++17起: from_chars/to_chars更高效
// 字符串转数值
string numStr = “123.45”;
int i = stoi(numStr); // 123
double d = stod(numStr); // 123.45
// 数值转字符串
string s1 = to_string(123); // “123”
string s2 = to_string(3.14159); // “3.141590”
string numStr = “123.45”;
int i = stoi(numStr); // 123
double d = stod(numStr); // 123.45
// 数值转字符串
string s1 = to_string(123); // “123”
string s2 = to_string(3.14159); // “3.141590”
⚖️ C风格字符串 vs string类
C风格字符串
优点:
- 内存占用小(仅字符数据)
- 与C语言兼容,适合跨语言开发
- 某些底层操作更高效
缺点:
- 需要手动管理内存,容易出错
- 缓冲区溢出风险
- 操作繁琐,需要调用函数
- 长度固定(静态分配时)
- 没有边界检查
C++ string类
优点:
- 自动管理内存,无需手动分配
- 动态调整大小
- 丰富的成员函数,操作方便
- 更安全(边界检查等)
- 支持运算符重载(+, =, ==等)
缺点:
- 内存占用稍大(包含长度、容量等信息)
- 与纯C代码交互时需要转换
- 某些极端性能场景可能不如C风格高效
🏁 总结与建议
对于C++初学者和大多数应用场景,强烈推荐使用string类。它更安全、更方便,能避免许多常见错误。
只有在需要与C语言交互、或者对性能有极端要求的特定场景下,才考虑使用C风格字符串。
记住:在C++中,string str = “Hello ” + string(“World”); 比 char str[20]; strcpy(str, “Hello “); strcat(str, “World”); 更安全、更简洁!