在 C++ 开发中,我们经常需要在字符串与其他数据类型之间相互转换 ,或是拼接多种类型数据 。C++ 流类库提供的字符串流(String Stream),就是专门解决这类问题的强大工具。
字符串流可以将内存中的字符串当作 "输入 / 输出流" 来操作,完美实现类型安全的格式转换、字符串拼接、数据解析,比手动处理字符数组更简洁、更安全。
本文将从字符串流概述、核心类、常用操作、实战场景四个维度,带你掌握字符串流的全部用法。
一、字符串流概述
1. 什么是字符串流?
字符串流是流类库中操作内存字符串 的流类,定义在 <sstream> 头文件中。
不操作文件,只操作内存里的字符串
用法和 cin、cout 完全一致,学习成本极低
用于:字符串拼接、类型转换、数据解析
2. 字符串流三大核心类
继承标准输入输出流,功能分工明确:
表格
| 类名 | 继承自 | 功能 |
|---|---|---|
ostringstream |
ostream |
输出字符串流:向字符串写入数据 |
istringstream |
istream |
输入字符串流:从字符串读取数据 |
stringstream |
iostream |
输入输出字符串流:可读可写(最常用) |
二、字符串流基本用法
1. 头文件
cpp
cpp
#include <sstream> // 字符串流必备
#include <string>
#include <iostream>
using namespace std;
2. 基础操作流程
- 创建字符串流对象
- 使用
<<写入数据(像cout一样) - 使用
>>读取数据(像cin一样) - 用
.str()获取 / 设置字符串内容
三、最常用:stringstream 用法
stringstream 支持同时读写,是开发中最常用的字符串流。
1. 写入数据 <<
cpp
stringstream ss;
ss << "姓名:" << "张三" << ", 年龄:" << 20 << ", 身高:" << 175.5;
- 获取字符串 .str ()
cpp
string result = ss.str(); // 把流里的内容转成 string
cout << result << endl;
输出:
cpp
姓名:张三, 年龄:20, 身高:175.5
3. 读取数据 >>
可以从字符串中自动解析出不同类型的数据:
cpp
stringstream ss("100 3.14 hello");
int a;
double b;
string c;
ss >> a >> b >> c; // 自动拆分并转换类型
cout << a << " " << b << " " << c << endl;
输出:
cpp
100 3.14 hello
四、字符串流三大实战用途
1. 任意类型拼接字符串(替代 sprintf)
传统 C 语言拼接复杂字符串很麻烦,字符串流一行搞定:
cpp
int id = 10;
string name = "苹果";
double price = 5.8;
stringstream ss;
ss << "商品编号:" << id << ", 名称:" << name << ", 价格:" << price;
string res = ss.str();
2. 字符串转数字(安全、自动)
无需 atoi、atof,类型安全,不会出错:
cpp
string str = "12345";
stringstream ss(str); // 用字符串初始化流
int num;
ss >> num; // 直接转成 int
- 数字转字符串(替代 itoa)
cpp
double pi = 3.14159;
stringstream ss;
ss << pi;
string str = ss.str(); // 数字 → 字符串
五、清空与重置字符串流
多次使用同一个字符串流时,需要清空内容 + 清空状态:
cpp
ss.str(""); // 清空字符串内容
ss.clear(); // 清空流错误状态
示例:
cpp
stringstream ss;
ss << 100;
ss.str(""); // 清空
ss << 200; // 重新使用
六、综合实战示例
示例 1:字符串拆分与类型解析
把一行文本自动解析成多种类型:
cpp
#include <sstream>
#include <iostream>
using namespace std;
int main() {
string data = "Tom 18 95.5";
stringstream ss(data);
string name;
int age;
double score;
ss >> name >> age >> score;
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "分数:" << score << endl;
return 0;
}
示例 2:多类型数据拼接
cpp
stringstream ss;
ss << "ID:" << 1001 << ", 状态:" << true << ", 精度:" << 0.001;
cout << ss.str() << endl;
七、字符串流常用成员函数
表格
| 函数 | 作用 |
|---|---|
ss << 数据 |
向流写入数据 |
ss >> 变量 |
从流读取数据到变量 |
ss.str() |
获取流中的字符串 |
ss.str("内容") |
设置字符串内容 |
ss.clear() |
清空流状态 |
ss.empty() |
判断是否为空 |
八、字符串流 vs 传统方法
表格
| 方式 | 优点 | 缺点 |
|---|---|---|
| 字符串流 | 类型安全、代码简洁、支持任意类型、无缓冲区溢出 | 略微多占一点内存 |
| sprintf / sscanf | 速度快 | 类型不安全、容易溢出、代码复杂 |
九、总结
字符串流是 C++ 流类库中处理字符串最方便的工具。
核心要点
- 头文件:
<sstream> - 三大类:
istringstream、ostringstream、stringstream - 最常用:
stringstream(可读可写) - 核心操作:
<<写入>>读取.str()获取字符串
- 三大用途:字符串拼接、类型转换、数据解析
- 清空:
str("")+clear()
掌握字符串流,你就能轻松处理所有字符串与数字互转、复杂字符串拼接问题。
总结
- 字符串流操作内存字符串,用法与标准 I/O 一致
stringstream功能最全面,支持读写- 可轻松实现数字转字符串、字符串转数字、多类型拼接、数据拆分
- 比 C 语言函数更安全、简洁、易维护
- 清空流用
str("")和clear()