C++ String Type Basics: String Operations and Common Methods

在C++中,处理字符串最常用的工具是string类。它比C语言的字符数组(char[])更安全、更易用,能帮我们避免很多内存管理问题。本文将从零开始,带你了解string的基本操作和常用方法,适合刚接触C++的初学者。

一、什么是string类?

在C语言中,字符串通常用字符数组(如char str[] = "hello";)表示,需要手动管理内存,且容易出错。而C++的string类是标准库的一部分,它封装了字符串的操作,让我们可以像处理普通变量一样处理字符串,无需关心内存分配和越界问题。

要使用string,需要先包含头文件<string>,并注意命名空间:

#include <string>   // 必须包含头文件
using namespace std;  // 或使用 std::string

二、string的定义与初始化

1. 直接赋值

最简单的方式是用等号给string变量赋值:

string s1 = "Hello";  // 直接赋值字符串常量
string s2 = s1;       // 复制已有字符串

2. 使用构造函数

string类提供了多种构造函数,可从字符数组、重复字符等初始化:

string s3("World");   // 从const char*构造
string s4(5, 'A');    // 构造5个'A'的字符串(结果:"AAAAA")
string s5;            // 空字符串(长度为0)

三、字符串的基本操作

1. 获取字符串长度

size()length()方法获取长度(两者效果相同):

string s = "C++";
cout << "长度: " << s.size() << endl;  // 输出:3
cout << "长度: " << s.length() << endl;  // 输出:3

注意size()返回的是size_t类型(无符号整数),不是普通整数。

2. 访问单个字符

可以用[]at()访问字符:

string s = "hello";
cout << s[0] << endl;   // 输出 'h'(直接访问,不检查越界)
cout << s.at(1) << endl; // 输出 'e'(安全访问,越界会抛异常)

危险提示[]不检查索引是否合法,若越界可能导致程序崩溃!

3. 字符串连接

++=连接字符串,或用append()方法:

string a = "Hello";
string b = " World";

// 方式1:+ 拼接(返回新字符串)
string c = a + b;  // c = "Hello World"

// 方式2:+= 拼接(直接修改原字符串)
a += b;  // a 变为 "Hello World"

// 方式3:append() 添加子串
a.append("!");  // a 变为 "Hello World!"

四、常用成员函数

1. 查找子串:find()

find()用于查找子串的位置,若找不到返回string::npos(一个极大值):

string s = "abcdefg";
size_t pos = s.find("cd");  // 查找 "cd"
if (pos != string::npos) {
    cout << "找到子串,位置:" << pos << endl;  // 输出:2("cd"在第2位,从0开始)
} else {
    cout << "未找到子串" << endl;
}

2. 替换子串:replace()

从指定位置开始,替换一定长度的字符:

string s = "I like apple";
// 替换从位置2开始的4个字符(原"like")为"love"
s.replace(2, 4, "love");  
cout << s << endl;  // 输出:"I love apple"

3. 插入子串:insert()

在指定位置插入字符串:

string s = "Hello";
s.insert(5, " World");  // 在位置5插入" World"
cout << s << endl;  // 输出:"Hello World"

4. 删除子串:erase()

从指定位置开始删除一定长度的字符:

string s = "Hello World";
s.erase(6, 5);  // 从位置6开始删除5个字符("World")
cout << s << endl;  // 输出:"Hello"

5. 比较字符串:compare()

比较两个字符串,返回:
- 0:相等
- 正数:当前字符串更大
- 负数:当前字符串更小

string a = "apple";
string b = "banana";
cout << a.compare(b) << endl;  // 输出 -1(a < b)

6. 清空字符串:clear()

删除所有字符,字符串变为空:

string s = "test";
s.clear();
cout << s.size() << endl;  // 输出:0

五、字符串与字符数组的转换

1. string转const char*

c_str()方法获取字符串的C风格表示(只读):

string s = "hello";
const char* cstr = s.c_str();  // 转换为const char*
cout << cstr << endl;  // 输出:hello

2. const char*转string

直接用构造函数或赋值:

const char* cstr = "world";
string s(cstr);  // 构造string
string s2 = cstr; // 赋值

六、注意事项

  1. 头文件必须包含:使用string前需包含<string>头文件,否则编译器会报错。

  2. 避免混用C风格字符串:不能用strcpystrcat等C函数直接操作string,应使用string自带的方法。

  3. size_t类型的陷阱size()返回size_t(无符号整数),若与负数比较需注意:

   if (s.size() > 0) { ... }  // 正确,因为s.size()不可能为负
   if (s.size() > -1) { ... } // 错误!s.size()是无符号,-1会被转为极大值,永远成立
  1. 空字符串判断:用empty()方法判断是否为空,比size() == 0更直观:
   if (s.empty()) { ... }  // s为空时执行

七、总结

string类是C++中处理字符串的核心工具,掌握它的基本操作和常用方法能极大简化字符串处理代码。重点记住:
- 定义与初始化:多种构造方式
- 基本操作:长度、字符访问、连接
- 常用方法:查找(find)、替换(replace)、插入(insert)、删除(erase)

多动手实践示例代码,就能快速熟悉这些用法!

Xiaoye