cpp►字符串操作之stringstream

本文详细介绍了C++标准库中的stringstream类,包括构造函数、str成员函数、赋值运算符以及交换函数的用法。stringstream允许将字符串视为输入/输出流,方便进行文本操作。通过示例展示了如何插入和提取数据,以及如何设置和获取内部字符串。

简介
<sstream>
istream
iostream
ostream
stringstream

std::stringstream
typedef basic_stringstream<char> stringstream;
流类对字符串进行操作。
此类的对象使用包含字符序列的字符串缓冲区(string buffer)。可以使用作为string对象的成员str直接访问这个字符序列。
可以使用在输入和输出流上允许的任何操作从流中插入和/或提取字符。

带有以下模板参数的basic_stringstream的实例:

模板参数定义描述
charTchar作为成员char_type的别名
traitschar_traits<char>作为成员traits_type的别名
Allocallocator<char>作为成员allocator_type的别名

除了内部string buffer之外,这些类的对象还保留一组从ios_base、ios和istream继承的内部字段:

成员类型
成员类型定义
char_typechar
traits_typechar_traits<char>
allocator_typeallocator<char>
int_typeint
pos_typestreampos
off_typestreamoff

以下这些成员类型继承自其基类istream、ostream和ios_base:

公有成员函数

➊构造函数:

default (1)	explicit stringstream(ios_base::openmode which = ios_base::in | ios_base::out);
initialization (2)	explicit stringstream(const string& str, ios_base::openmode which = ios_base::in | ios_base::out);
copy (3)	stringstream(const stringstream&) = delete;
move (4)	stringstream(stringstream&& x);
// swapping ostringstream objects
#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream
int main () {
  std::stringstream ss;
  ss << 100 << ' ' << 200;
  int foo, bar;
  ss >> foo >> bar;
  std::cout << "foo: " << foo << '\n';
  std::cout << "bar: " << bar << '\n';
  return 0;
}
foo: 100
bar: 200

代码解释:

ostream& operator<< (someType val);
参数val:Value to be formatted and inserted into the stream.
要格式化并插入到流中的值。
istream& operator>> (someType& val);
参数val:Object where the value that the extracted characters represent is stored.
对象,其中存储提取的字符所表示的值。

stringstream ss;
ss << 100;// 100这个int型值插入到流ss中。
ss >> foo;// 提取流ss中的值并存储到对象foo中。

➋str
string str() const;// get
void str (const string& s);// set

// stringstream::str
#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream, std::stringbuf
int main () {
  std::stringstream ss;
  ss.str("Example string");
  std::string s = ss.str();
  std::cout << s << '\n';
  return 0;
}
Example string

➌operator=
copy (1) stringstream& operator= (const stringstream&) = delete;
move (2) stringstream& operator= (stringstream&& rhs);
➍swap
void swap (stringstream& x);
Exchanges all internal data between x and *this.

// swapping stringstream objects
#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream
int main () {
  std::stringstream foo;
  std::stringstream bar;
  foo << 100;
  bar << 200;
  foo.swap(bar);
  int val;
  foo >> val; std::cout << "foo: " << val << '\n';
  bar >> val; std::cout << "bar: " << val << '\n';
  return 0;
}
foo: 200
bar: 100
其他继承而来的函数

### 如何使用 C++ 的 `stringstream` 来分割字符串C++ 中,`stringstream` 提供了一种简单而有效的方法来解析和分割字符串。它允许开发者像对待标准输入/输出流一样操作字符串数据[^1]。 下面是一个具体的例子,展示如何利用 `stringstream` 将一个由特定分隔符(如逗号 `,` 或空格)组成的字符串拆分成多个子串: #### 示例代码 ```cpp #include <iostream> #include <sstream> // 包含 stringstream 定义的头文件 #include <vector> #include <string> int main() { std::string input = "apple,banana,cherry,date"; // 原始字符串 std::vector<std::string> result; // 存储分割后的结果 std::stringstream ss(input); // 创建 stringstream 对象并初始化为原始字符串 std::string item; while (std::getline(ss, item, ',')) { // 使用 getline 函数按指定分隔符读取每一部分 result.push_back(item); // 将每一段存入 vector } // 输出分割结果 for (const auto& str : result) { std::cout << str << std::endl; } return 0; } ``` 上述程序的功能如下: - 首先定义了一个包含水果名称的字符串 `"apple,banana,cherry,date"`。 - 利用 `std::stringstream` 构造函数创建对象 `ss` 并将其初始化为目标字符串。 - 调用了循环中的 `std::getline()` 方法,该方法能够按照给定字符(这里是逗号`,`)逐一分割字符串,并将每次提取的部分存储到变量 `item` 中。 - 最终,这些片段被逐一加入向量容器 `result` 中以便后续处理或显示。 这种方法不仅限于逗号作为分隔符;可以通过更改传递给 `std::getline()` 的第三个参数来自定义任何其他单字符分隔符。 #### 注意事项 当遇到连续的分隔符或者开头结尾存在多余分隔符的情况时,需额外注意逻辑设计以避免错误解读空白项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值