C++字符串

C++字符串知识点详解

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); // 连接字符串
C++ string类
  • C++标准库提供的字符串类
  • 自动管理内存,无需担心内存分配
  • 提供丰富的成员函数
  • 更安全、更易用
  • 需要包含<string>头文件
#include <string>

// 创建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;
访问字符串内容
  • 下标访问: 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;
}
字符串修改操作
  • 追加: 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”
字符串比较与查找
  • 比较: ==, !=, <, >, <=, >= 或 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)
字符串与数值转换
  • 转整数: 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”

⚖️ 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”); 更安全、更简洁!

© 2023 C++字符串学习指南 | 编程小白友好版 | 建议结合实践练习

提示:学习编程最好的方式是动手写代码!尝试创建一个程序处理用户输入的字符串吧!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部