stringstream的使用

news2024/11/23 15:30:34

写到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, 42
    
    std::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.coloradmin.cn/o/747518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RT1176 LCDIFv2 RGB565引脚不连续

RT1052和RT1176的LCDIF&#xff0c;使用RGB565格式时PIN脚分配是连续的:LCDIF_DATA00~LCDIF_DATA15。 但RT1176的LCDIFv2并不是这样&#xff0c;使用RGB565格式时PIN脚分配不是连续的&#xff0c;而是移位填充8位*324位分配的。 RT1176 LCDIFv2 RGB565LCDIF_DATA00LCDIF_DATA0…

CVE漏洞复现-CVE-2021-36934 Windows 提权漏洞

CVE-2021-36934 Windows 提权漏洞 漏洞描述 7月20日&#xff0c;微软确认了一个新的本地提权漏洞&#xff0c;安全研究成员将其称为HiveNightmare或者SeriousSAM&#xff0c;该漏洞允许低权限的用户访问Windows系统文件。成功利用此漏洞的攻击者可以使用SYSTEM特权运行任意代…

16位ADC芯片SGM58031驱动重点

16位ADC芯片SGM58031驱动重点 文章目录 16位ADC芯片SGM58031驱动重点引脚描述时间要求I2C时序图I2C通讯描述I2C接口I2C地址选择I2C常规呼叫I2C速度模式从模式操作 寄存器指针寄存器转换寄存器配置寄存器低阈值和高阈值寄存器Config1寄存器芯片ID寄存器GN_Trim1寄存器&#xff0…

Linux(驱动编程)(调试技术)(imx6ull)

调试技术 1、在写驱动程序时函数未包含头文件 在linux内核源码driver/char目录下输入命令 grep “XXXX” * -nrw查看次函数在那个.c里用过&#xff0c;然后在vscode界面下按altp搜索这个.c就可以参考这个.c的头文件。 2、编译完驱动跟应用后先 insmod xxx.ko //插入 cat /…

原创 | SQL和 NoSQL的基本操作和查询语句

作者&#xff1a;杨金珊本文约3500字&#xff0c;建议阅读7分钟本文为你介绍SQL和 NoSQL的基本操作和查询语句。 SQL&#xff08;结构化查询语言&#xff09; SQL是用于管理和操作关系型数据库的语言。它遵循结构化模式&#xff0c;将数据组织成具有预定义关系的表格形式。以下…

告别被坑!掌握合合信息AI图像篡改检测工具,轻松识别图片造假

文章目录 一、前言1.1 背景与危害1.2会议探讨1.3 技术先行 二、亮点技术1&#xff1a;AI图像篡改检测技术2.1 传统方法Python实现步骤2.2 合合信息——PS纂改检测体验 三、亮点技术2&#xff1a;生成式图像鉴别3.1 生成式图像安全问题3.2 传统方法Python实现步骤3.2 合合信息—…

03_007linux内存管理架构以虚拟内存空间布局架构

内存管理子系统架构 内存管理子系统架构可以分为:用户空间、内核空间及硬件部分3个层面&#xff0c;具体结构如 下图所示: 1、用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。 2、内核空间:内核总是驻留在内存中&#xff0c;是操作系统的一部分。内核空间为内…

nginx uwsgi配置django

uwsgi文件 [uwsgi] # 服务端口号&#xff0c;这里没有设置IP值&#xff0c;默认是加载服务器的IP地址 #http :5000 socket:8000 # flask项目地址 chdir /pyprogram/electric # wsgi文件 /home/flask_project/mange.py #module app:app wsgi-file/pyprogram/electric/electr…

CompletionService的基本使用以及原理

文章目录 一、CompletionService的简介二、CompletionService的底层大致原理三、CompletionService的使用场景1. 批量下载文件&#xff1a;2. 多个商品价格查询&#xff1a;3. 并发处理多个API请求&#xff1a; 四、CompletionService的使用demo1. 代码如下&#xff1a;2. 案例…

mac上 如何批量在文件名中插入文字

mac上 如何批量在文件名中插入文字&#xff1f;在使用Mac电脑的时候&#xff0c;我们经常需要对大量文件的名称进行修改&#xff0c;例如需要在大量文件的名称中插入一些相同的文字或者字符的时候&#xff0c;你会用什么方法来完成这项工作呢&#xff1f;相信很多人就面对过类似…

前端vue入门(纯代码)30_路由的props配置

喜欢的东西太贵了&#xff0c;我一咬牙&#xff0c;狠下心决定不喜欢了&#xff01; 【28.Vue Router--路由的props配置】 props配置官网文档 props属性用法和params属性差不多&#xff0c;都是要在src/router/index.js文件中配置 // 该文件专门用于创建整个应用的路由器 i…

Spring 项目的创建和使用1(配置国内源)

目录 一、Spring项目的创建 1. 创建Maven项目 2. 添加Spring依赖&#xff08;重要&#xff09; (1) 必须要设置两个配置文件的国内源配置&#xff08;当前项目配置文件&#xff0c;新项目配置文件&#xff09; (2) 复制上一步中的User setting file 后面的路径在文件资源管理…

SpringBoot集成Flowable工作流

SpringBoot集成Flowable工作流 Flowable是什么&#xff1f;一、添加依赖二、flowable配置三、定义流程文件1.使用流程文件定义工作流2.idea使用插件来定义流程图1.安装插件2.创建bpmn文件并画流程图3.右击流程用模型设计器打开文件 四、测试controller Flowable是什么&#xff…

美女与修狗儿【 InsCode Stable Diffusion 美图活动一期】

女朋友最近买了一只小泰迪&#xff0c;于是给她和修狗儿做一幅画 一、Stable Diffusion 模型在线使用地址 https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型版本及相关配置 模型&#xff1a;chilloutmix-Ni.safetensors[7234b76e42采样方法&#xff1a;Euler a…

算法拾遗三十五indexTree和AC自动机

算法拾遗三十五indexTree和AC自动机 indexTree&#xff08;树状数组&#xff09;indexTree规则 IndexTree二维AC自动机 indexTree&#xff08;树状数组&#xff09; 给定数组下标统一从1开始 如果要求L。。R范围上任意区间的和&#xff0c;我们通常的解法是定义一个help&…

msvcp140.dll重新安装的解决方法,msvcp140.dll丢失修复教程

计算提示msvcp140.dll丢失需要怎么重新安装呢&#xff1f;下面小编就把msvcp140.dll丢失重新安装的修复教程分享给大家。msvcp140.dll是Microsoft Visual C Redistributable文件的一部分&#xff0c;它是一个动态链接库文件。该文件包含了一些用于C程序开发的函数和类的定义&am…

【Vue2.0源码学习】模板编译篇-模板解析阶段(HTML解析器)

文章目录 1. 前言2. HTML解析器内部运行流程3. 如何解析不同的内容3.1 解析HTML注释3.2 解析条件注释3.3 解析DOCTYPE3.4 解析开始标签3.5 解析结束标签3.6 解析文本 4. 如何保证AST节点层级关系5. 回归源码5.1 HTML解析器源码5.2 parseEndTag函数源码 6. 总结 1. 前言 上篇文…

如何应对ChatGPT这一波AI浪潮

最近我在写一系列文章&#xff0c;其中包括《ChatGPT 实战系列》和《WPS Office AI实战系列》。想通过这些文章提供实践指导&#xff0c;既自己动手实践了&#xff0c;也能与大家分享我的实践结果&#xff0c;这是一个学习的过程。在实践过程中&#xff0c;我发现有些实用的方面…

基于springboot文学创作的社交论坛新闻文章系统vue

相比于传统的社交论坛管理方式&#xff0c;智能化的管理方式可以大幅提高社交论坛的管理效率&#xff0c;实现了社交论坛管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了社交论坛信息的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准…

OnlyHome三代金属智能手环|健康、科技齐实现

近年来,人们越来越追求生活的品质与趣味,生活中的一点点小确幸、小惊喜最能让人感受到深深地愉悦。这不,Only&Home三代金属智能手环也带来了惊喜,有了它,健康、科技两手抓,享受生活更自由。 Only&Home三代金属智能手环给人的第一印象是它超高的颜值,延用了二代手环奢华…