C++ 的 std::string 表示可变长度的字符序列,由对象管理容量、拷贝和长度,比 C 风格字符数组更少依赖手工维护 '\0'。头文件为 <string>。本节在输入输出与数组基础上说明构造、修改、比较、查找与读取一行文本。

构造与基本操作

C++ string 拼接与 size运行
#include <iostream>
#include <string>

int main() {
    std::string s = "C++";
    s += " tutorial";
    std::cout << s.size() << " " << s << std::endl;
    std::cout << s.empty() << std::endl;
    return 0;
}

输出:

12 C++ tutorial
0

字符串 "C++" 有三个字符,接上 " tutorial"(包含最前面的空格),合起来一共 12 个字符。size() 统计字符数量,不算末尾那个结束符 '\0'。empty() 判断字符串是否为空,不为空的时候返回 false,打印出来就是 0。length() 和 size() 作用完全一样;clear() 用来清空字符串里面的内容。

访问字符

std::string s = "abc";
char c0 = s[0];
char c1 = s.at(1);   // 越界时抛出 std::out_of_range
s[0] = 'A';

用 [] 访问不做越界检查;at() 越界会抛出 std::out_of_range 异常。front()、back() 用来取首尾字符,调用前提是容器不能为空。

比较与查找

std::string a = "abc";
std::string b = "abd";
if (a < b) {
    std::cout << "lexicographic order\n";
}
std::size_t pos = a.find("bc");
if (pos != std::string::npos) {
    std::cout << "found at " << pos << std::endl;
}

关系运算符按字典序比较:abc 与 abd 前两字符相同,第三字符较小,故 a < b。find("bc") 从下标 1 起匹配;未找到时返回 std::string::npos,使用前先与它比较。rfind 从后往前找;substr(pos, len) 返回子串副本。

成员(常用)作用
append / +=在末尾追加字符或字符串
insert / erase在指定位置插入或删除
substr(pos, len)返回子串副本
c_str()以 '\0' 结尾的 C 风格指针,供 C API 使用

与 C 字符串

字符串字面量可用来构造 std::string。c_str() 返回的指针随对象有效:对象销毁或因扩容重新分配后,不得继续使用旧指针。与 printf 等 C 接口交互时,常用 %s 配合 s.c_str()。

读取一行与单词

#include <iostream>
#include <string>

std::string word;
std::cin >> word;              // 跳过前导空白,读到空白为止

std::string line;
std::getline(std::cin, line);  // 读取一整行(含空格),读到换行符

混合使用 operator>> 与 getline 时,缓冲区可能残留换行,下一次 getline 会读到空行。可在 getline 前 std::cin.ignore() 丢弃至换行,或统一用一种读取方式。

与 vector 的对比

string 面向文本;通用元素序列见vector。二者均支持 size、下标与范围 for。成员函数逐条查阅见标准库 <string>。

本节说明了 std::string 的构造、修改、比较与输入。下一节介绍std::vector:动态数组容器与容量管理。