stringstream是 C 标准库sstream中提供的一个非常实用的类核心作用是把字符串当作 “流” 来处理实现字符串和各种数据类型如 int、float 等之间的灵活转换以及字符串的拆分 / 拼接。一、stringstream 核心作用与基础用法1. 先明确核心概念stringstream本质是 “内存中的字符串流”可以像操作cin输入流、cout输出流一样操作它往stringstream里写入数据如数字转字符串从stringstream里读取数据如字符串转数字拆分带分隔符的字符串如按空格 / 逗号拆分。2. 必备前置条件使用stringstream必须包含头文件#include sstream // 核心头文件 #include string // 处理字符串 #include iostream // 用于输出测试 using namespace std; // 新手可简化代码避免频繁写 std::二、常用场景与完整代码示例场景 1数字转字符串最常用把 int、float、double 等数值类型转换成字符串比手写拼接更简洁、不易出错。// 数字转字符串 void number_to_string() { int num 123; float f 3.1415; stringstream ss; // 方式1逐个写入 ss 整数 num 浮点数 f; string result ss.str(); // str() 方法获取流中的完整字符串 cout 拼接结果 result endl; // 方式2单独转换单个数字 stringstream ss2; ss2 num; string num_str ss2.str(); cout 仅整数转字符串 num_str endl; }输出结果拼接结果整数123浮点数3.1415仅整数转字符串123场景 2字符串转数字把表示数字的字符串如 456、7.89转换成对应的数值类型比atoi更通用支持更多类型。// 字符串转数字 void string_to_number() { string str_num 456; string str_float 7.89; int n; double d; // 字符串转int stringstream ss1(str_num); // 初始化时传入字符串 ss1 n; // 从流中读取到int变量 cout 字符串转int n endl; // 字符串转double stringstream ss2(str_float); ss2 d; cout 字符串转double d endl; }输出结果字符串转int456字符串转double7.89场景 3拆分带分隔符的字符串比如把 hello world 123 按空格拆分或把 1,2,3,4 按逗号拆分。// 拆分字符串按空格/逗号 void split_string() { // 示例1按空格拆分 string str1 apple banana orange; stringstream ss1(str1); string word; cout 按空格拆分结果 endl; while (ss1 word) { // 会自动以空格/换行作为分隔符 cout word endl; } // 示例2按逗号拆分需先替换逗号为空格再拆分 string str2 1,2,3,4,5; stringstream ss2; // 先替换逗号为空格 for (char c : str2) { if (c ,) c ; } ss2.str(str2); // 给流设置处理后的字符串 int num; cout 按逗号拆分结果 endl; while (ss2 num) { cout num endl; } }输出结果按空格拆分结果applebananaorange按逗号拆分结果12345场景 4复用 stringstream清空流如果想重复使用同一个stringstream对象需要用clear()清空状态 str()清空内容// 复用 stringstream void reuse_stringstream() { stringstream ss; // 第一次使用 ss 123; string s1 ss.str(); cout 第一次使用 s1 endl; // 清空必须同时做这两步 ss.clear(); // 清空流的状态如eof、fail等 ss.str(); // 清空流中的字符串内容 // 第二次使用 ss hello; string s2 ss.str(); cout 第二次使用 s2 endl; }输出结果第一次使用123第二次使用hello总结stringstream是 C 处理字符串与数值转换、字符串拆分的核心工具需包含sstream头文件核心操作写入数据转字符串、读取数据转数值、str()获取 / 设置流中的字符串复用流时必须同时调用clear()清状态和str()清内容否则会出现数据残留问题。它的优势是类型安全相比 C 语言的sprintf/atoi、用法灵活是 C 中处理字符串的首选方式之一。例题L1-6 这不是字符串题#includebits/stdc.h using namespace std; // 辅助函数将字符串序列转为整数数组 vectorint str_to_nums(const string s) { vectorint nums; stringstream ss(s); int num; while (ss num) { nums.push_back(num); } return nums; } // 辅助函数将整数数组转为字符串序列 string nums_to_str(const vectorint nums) { string s; for (int i 0; i nums.size(); i) { s to_string(nums[i]); if (i ! nums.size() - 1) { s ; } } return s; } // 辅助函数在数组中查找连续子序列操作1 int find_subsequence(const vectorint nums, const vectorint sub) { if (sub.empty() || nums.size() sub.size()) return -1; for (int i 0; i nums.size() - sub.size(); i) { bool match true; for (int j 0; j sub.size(); j) { if (nums[ij] ! sub[j]) { match false; break; } } if (match) return i; } return -1; } int main() { ios::sync_with_stdio(false); // 关闭同步加速cin/cout cin.tie(nullptr); // 解绑cin和cout int n, m; if (!(cin n m)) return 0; // 第一步读取初始序列转为数组存储核心优化 vectorint nums(n); for (int i 0; i n; i) { cin nums[i]; } while (m--) { int x; cin x; // 操作1替换连续子序列 if (x 1) { int l1; cin l1; vectorint sub1(l1); for (int i 0; i l1; i) { cin sub1[i]; } int l2; cin l2; vectorint sub2(l2); for (int i 0; i l2; i) { cin sub2[i]; } // 查找子序列位置 int pos find_subsequence(nums, sub1); if (pos ! -1) { // 替换删除原序列插入新序列 nums.erase(nums.begin() pos, nums.begin() pos l1); nums.insert(nums.begin() pos, sub2.begin(), sub2.end()); } } // 操作2相邻和为偶数则插入平均数 else if (x 2) { // 从后往前遍历避免插入后影响后续索引 for (int i nums.size() - 2; i 0; --i) { int l nums[i]; int r nums[i1]; if ((l r) % 2 0) { int av (l r) / 2; nums.insert(nums.begin() i 1, av); } } } // 操作3截取区间逆序后替换 else { int l, r; // 闭区间数字位置从1开始 cin l r; if (l r) continue; // 转换为数组索引从0开始 int start l - 1; int end r - 1; // 逆序区间内的元素 reverse(nums.begin() start, nums.begin() end 1); } } // 输出最终序列 cout nums_to_str(nums) endl; return 0; }