【c++】|【stringstream】实用用法介绍

引言

在 C++ 中,stringstream 是一个非常强大且实用的字符串流处理类。它允许我们将字符串当作流(类似 cin 和 cout)来进行读写操作,主要用于字符串的格式化、类型转换和数据解析

由于笔者在学习这部分内容时没有找到自己喜欢的文章,遂自己动手写一篇,希望接下来我 最直白、最不绕弯子、最直接、最硬核、最干脆、最不墨迹、最戳痛点、最开门见山、最单刀直入、最不铺垫、最不客套、最不煽情、最不废话、最不拐弯、最不磨叽、最不装、最不端着、最不啰嗦、最不拖沓、最不委婉、最不掩饰、最不藏着掖着、最露骨、最实在、最底层 的介绍能帮到你。(参考文献——豆包大人)

基础操作

头文件

include<sstream>

构造

  1. 基础构造(空流):
    stringstream ss;

  2. 用字符串初始化:
    string data = "Hello World";
    stringstream ss(data);
    or
    stringstream ss("Hello");

获取字符串内容

string s = ss.str();

写入数据(拼接字符串)

使用 << 运算符将 各种类型的数据 写入流中。

例如:

int age = 25;
double score = 98.5;
ss << "姓名:小明" << "\n年龄:" << age << "\n分数:" << score;

最后cout<<ss.str();得到如下运行结果
写入

读取数据(解析字符串)

使用 >> 运算符从流中提取数据,默认以空白字符(空格、换行等)作为分隔符。

string data = "小明 179.5";
stringstream ss(data);
string name; //姓名 
float stature; //身高 
ss >> name >> stature; //提取并装入变量 

加上cout << "姓名:" << name << "\n身高:" << stature << " cm";后运行结果be like:
读取

补充:如果分隔符为非空白字符,如 ** (逗号), **
核心语法:getline(流对象, 接收变量, '自定义分隔符')

string data = "apple,banana,cherry,date";
stringstream ss(data);
string token;
while (getline(ss, token, ',')) {
	cout << token << endl;
}

Q&A:

  1. 最后一个字符串没有逗号能正常读取吗?
    完全可以。
    getline 的读取逻辑是:从当前位置开始读取,直到遇到指定的分隔符(如逗号)或者到达文件/流的末尾(EOF)。 这意味着,即使最后一部分后面没有逗号,只要流还没结束,它依然会被成功提取出来。
  2. getline 会有危险吗?
    有的兄弟有的
    陷阱一:连续逗号会产生空字符串,末尾的逗号也会产生空字符串
    如果数据是 “a,,b”,getline 会忠实地切分出 “a”、“”(空字符串)、“b”。
    如果数据是 “x,y,z,”,最后一次 getline 会读出一个空字符串 “”。
    陷阱二:不会自动去除首尾空格
    如果数据是"a,b, c",提取出来的分别是"a",“b”," c"。getline 只认逗号,不管里面的空格。
    陷阱三:不支持引号转义(高级 CSV 特性)
    如果数据是 ““a,b”,c”,getline 遇到第一个逗号就会切断,它无法识别双引号包裹的合法逗号。

正确重用方式

ss.str(""); // 清空内容
ss.clear(); // 清除状态标志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值