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