stringstream的使用

写到290题使用stringstream简化步骤,学习一下使用

目录

小问题?

成员函数clear()

 那么问题来了?clear在啥时候用呢?

数据类型转换


<sstream>库定义了三种类:istringstream、ostringstream、stringstream

<sstream> 主要用来进行数据类型转换,比如可以将一个int类型的对象存入流中,然后经过流赋值给一个string的对象中,从而实现了int到string的转变,由于 <sstream> 使用 string 对象来代替字符数组,就避免缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言,<sstream> 更加安全、自动和直接。
 

istringstream、ostringstream 一个负责流的输入,把字符串类型转为实际类型,就是把流里面的字符串输入到一个变量里面 ;  一个负责输出,把实际类型转为字符串类型,就是把数据输出到流里面

stringstream就是输入输出,二者结合

他们通过插入器"<<"和析取器">>"这两个运算符可以直接对流上数据进行操作。

istringstream搭配>>,ostringstream搭配<<

stringstream都能用,上面俩可以说是他的特化版本

使用 std::stringstream,你可以将字符串分割成单词、提取数字、格式化输出等。下面是一些 std::stringstream 的常见用法:

  1. 字符串输入:可以使用 << 运算符将数据插入到 std::stringstream 对象中,如下所示:

        std::stringstream ss;std::string str = "Hello, world!";int num = 42;ss << str << " " << num;cout << ss.str() << endl;// ss流里是Hello, world! 42
  2. ①.void str():无参数形式,用于将stringstream中的数据以string字符串的形式输出

    ②.void str(const string&s1):以字符串为参数,覆盖stringstream流中的数据

        ss.str("nihaoya");cout << ss.str() << endl;
    
  3. 字符串输出:可以使用 >> 运算符从 std::stringstream 对象中提取数据,如下所示:

    //ss流里是Hello, 42std::string tmp;
    int n;
    ss >> tmp >> n;cout<<tmp<<endl; //Hello,
    cout<<n<<endl;   //42
  4. 分割字符串:可以使用 >> 运算符将 std::stringstream 对象中的字符串按空格分割成单词,如下所示:

        std::stringstream sp("Hello, world!");std::string word;while (sp >> word){// 对每个单词进行处理cout << word << endl;}cout << word << endl;
  5. 格式化输出:可以使用 << 运算符将数据按指定格式输出到 std::stringstream 对象中,如下所示:

    std::stringstream ss;
    int num = 42;
    double pi = 3.14159;
    ss << "The number is: " << std::setw(5) << num << ", and PI is: " << std::setprecision(3) << pi;

小问题?

正常插入是这样,从末尾插入

    std::stringstream sp;std::string word("Hello, world!");sp<<word;cout<<sp.str()<<endl;string ty="sad44asd";sp<<ty;cout<<sp.str()<<endl;

 但是给流初始化之后再插入

从头插入的

std::stringstream sp("Hello, world!");cout<<sp.str()<<endl;string ty="sad44asd";sp<<ty;cout<<sp.str()<<endl;

使用stringstream时的清空操作

在C++中可以使用stringstream来很方便的进行类型转换,字符串串接,不过注意重复使用同一个stringstream对象时要 先继续清空,而清空很容易想到是clear方法,而在stringstream中这个方法实际上是清空stringstream的状态(比如出错等),真正清空内容需要使用.str("")方法。
 

成员函数clear()

 利用成员函数clear()只能清空流的状态,但此时流占用的内存没有改变,多次调用同一个ss对象则导致内存会一直增加,因为stringstream不主动释放内存,若想改变内存,则需要配合成员函数void str(const string&s1)来完成。

为什么?看个例子:

    std::stringstream sp;std::string word("Hello, world!");sp<<word;cout<<sp.str()<<endl;string ty="sad44asd";sp<<ty;cout<<sp.str()<<endl;sp.clear();cout<<sp.str()<<endl;

 可以看到并没有清除内容,只有配合str("")才行,相当于把他覆盖成一个空字符串

std::stringstream sp;std::string word("Hello, world!");sp<<word;cout<<sp.str()<<endl;string ty="sad44asd";sp<<ty;cout<<sp.str()<<endl;sp.str("");//sp.clear();cout<<sp.str()<<endl;

 那么问题来了?clear在啥时候用呢?

当要多次进行类型转换的时候用,啥意思 ,看示例代码

int main()
{stringstream sstream;int first, second;// 插入字符串sstream << "456";// 转换为int类型sstream >> first;cout << first << endl;// 在进行多次类型转换前,必须先运行clear()//sstream.clear();// 插入bool值sstream << true;// 转换为int类型sstream >> second;cout << second << endl;system("pause");
}

理论上应该输出,456 和1 

 第二个转换输出了乱码,因为没有清除状态,可能导致之前的456仍然存在,影响到后面类型转换

加上clear,清除之前的状态,就能输出正确了

stringstream sstream;int first, second;// 插入字符串sstream << "456";// 转换为int类型sstream >> first;cout << first << endl;// 在进行多次类型转换前,必须先运行clear()sstream.clear();// 插入bool值sstream << true;// 转换为int类型sstream >> second;cout << second << endl;system("pause");

数据类型转换

这里展示一个代码示例,该示例介绍了将 int 类型转换为 string 类型的过程

#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>using namespace std;int main()
{stringstream sstream;string strResult;int nValue = 1000;// 将int类型的值放入输入流中sstream << nValue;// 从sstream中抽取前面插入的int类型的值,赋给string类型sstream >> strResult;cout << "[cout]strResult is: " << strResult << endl;printf("[printf]strResult is: %s\n", strResult.c_str());return 0;
}

sting流:istringstream,ostringstream,stringstream。教会你str()和clear()的区别_istringstream.str_简单奥利奥的博客-CSDN博客

别的使用方法看这个 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19600.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 项目使用 Elasticsearch 对 Word、Pdf 等文档内容的检索

本文参考自&#xff1a;https://blog.csdn.net/Q54665642ljf/article/details/127701719 本文适用于elasticsearch入门小白&#xff0c;还请大佬能指出我的不足&#xff08;本人其实也是刚学elasticsearch没多久&#xff09; 文章目录 一、准备工作1.1 安装ES文本抽取插件1.2 …

从网络安全行业人才需求讲讲【个人规划】

如果你是一名正在找工作的网络安全方向大学生&#xff0c;或者是刚刚踏入网络安全领域的新手&#xff0c;这篇文章很适合你&#xff0c;如果你是一名老网安人&#xff0c;看看有哪些你中招了。 当你打开BOSS直聘、拉钩等招聘类网站后&#xff0c;在首页的快速导航页面很难找到关…

请求响应-响应-案例

案例需求 加载并解析emp.xml文件中的数据&#xff0c;完成数据处理&#xff0c;并在页面展示 emp.xml文件代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <emps><emp><name>金毛狮王</name><age>5…

Centos和redhat桥接模式下固定第二个ip地址为可查

这里我们以centos为例子&#xff0c;redhat与其同理 第一步&#xff1a;进入到镜像network-scripts/目录下 cd /etc/sysconfig/network-scripts 第二步&#xff1a; 输入ls查看自己启用的网卡名字并进行编辑&#xff0c;一般centos默认使用的网卡是idcfg-ens33 第三步&…

【Linux】分布式监控 Zabbix

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Zabbix 介绍zabbix 概述Zabbix 监控原理Zabbix 6.0 新特性Zabbix 6.0 功能组件 Zabbix 6.0 部署Zabbix 添加客户端主机Zabbix 自定义监控内容Zabbix 自动发现与自动…

【深度学习】日常笔记10

loss_fn nn.MSELoss(reductionnone)这行代码&#xff0c;在这个上下文中&#xff0c;loss_fn实际上是一个损失函数对象而不是返回的具体值。 使用nn.MSELoss(reductionnone)创建的loss_fn是一个均方误差损失函数对象&#xff0c;而不是计算后的结果。要计算具体的损失值&…

系统升级丨让VR全景制作简单再简单

最高端的VR全景 往往只需要最朴素的制作方式 酷雷曼3D VR数字化升级平台4.0版本 闪耀上线 全新的后台界面 丝滑的编辑工具 无需代码 不用建模 简单拖拉拽移 依然有手就行 轻松搭建VR元宇宙空间 1、界面升级&#xff0c;让VR创作更加可视 全新视觉设计 酷雷曼3D VR…

【前端】网页开发精讲与实战 CSS Day 2

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;前端 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对你有…

电路分析基础学习(上)第4章

李瀚荪版电分第二版 目录 求单口网络的VCR 常用等效规律 戴维南定理 诺顿定理 诺顿定理和戴维南定理应该如何选择&#xff0c;或者说对应不同的电路&#xff0c;选择哪一种等效电路更简单&#xff1f; 双口网络 分析含理想二极管的电路 -----------------------------…

Go自带库的使用说明

Go 中的时间操作 Golang中与时间有关的操作&#xff0c;主要涉及到 time 包&#xff0c;核心数据结构是 time.Time&#xff0c;如下&#xff1a; type Time struct {wall uint64ext int64loc *Location }1、获取时间相关函数 1.1 获取当前时间 // 返回当前时间&#xff0c…

APP外包开发硬件通讯协议

开发APP时会遇到需要与硬件设备通讯的业务场景&#xff0c;常见的硬件设备有健康设备(手环、血压计、血糖仪等)、智能家居设备(冰箱、灯、电视等)、工业设备等等&#xff0c;这些设备的通讯要求各不相同&#xff0c;因此通讯协议也不相同。今天和大家分享这方面的知识&#xff…

微服务拆分原则

库存供应链服务 交易和订单服务 用户服务 1. 业务之间耦合降低 相互调用较少 进行拆分 2.修改频率区分不同服务