C++stringstream的妙用「建议收藏」

C++stringstream的妙用「建议收藏」1介绍C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。istringstream类用于执行C++风格的串流的输入操作。ostringstream类用于执行C风格的串流的输出操作。strstream类同时可以支持C风格的串流的输入输出操作。istringstream类是从istre…

大家好,又见面了,我是你们的朋友全栈君。

1 介绍

C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。

istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。

istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和 stringstreambase派生而来,stringstream则是从iostream类和stringstreambase派生而来。
他们的继承关系如下图所示:
在这里插入图片描述

2 istringstream

istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。
istringstream的构造函数原形如下:

istringstream::istringstream(string str);

示例代码如下:

#include <iostream>
#include <sstream>

using namespace std;

int main()
{ 
   
    istringstream istr;
    istr.str("1 56.7");
    //上述两个过程可以简单写成 istringstream istr("1 56.7");
    cout << istr.str() << endl;
    int a;
    float b;
    istr >> a;
    cout << a << endl;
    istr >> b;
    cout << b << endl;
    return 0;
}

上例中,构造字符串流的时候,空格会成为字符串参数的内部分界, 例子中对a,b对象的输入”赋值”操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。
str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)。

3 ostringstream

ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。
ostringstream的构造函数原形如下:

ostringstream::ostringstream(string str); 

示例代码如下:

#include <iostream>
#include <sstream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{ 
   
	ostringstream ostr;
	    //ostr.str("abc");
	    //如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长
	ostr.put('d');
	ostr.put('e');
	ostr<<"fg";
	
	    string gstr = ostr.str();
	    cout<<gstr;
	    system("pause");
}

在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值 得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。
[ basic_stringbuf::str : Sets or gets the text in a string buffer without changing the write position. ]

4 stringstream

对于stringstream了来说,不用我多说,大家也已经知道它是用于C++风格的字符串的输入输出的。
stringstream的构造函数原形如下:

stringstream::stringstream(string str);

示例代码如下:

#include <iostream>
#include <sstream>
#include <string>
#include<cstdlib>
using namespace std;

int main()
{ 
   
	stringstream ostr("ccc");
	ostr.put('d');
	ostr.put('e');
	ostr<<"fg";
	string gstr = ostr.str();
	cout<<gstr<<endl;
	
	char a;
	ostr>>a; //可以看到stringstream对象既可以做输入流也可以做输出流
	cout<<a;
	system("pause");
}

4.1 stringstream用于数据类型转换

stringtream最常用于string与各种内置数据类型的转换。
示例代码如下:

#include <iostream>
#include <sstream>
#include <string>
#include<cstdlib>
using namespace std;

int main()
{ 
   
	stringstream sstr;
	//--------int转string-----------
	int a=100;
	string str;
	sstr<<a;
	sstr>>str;
	cout<<str<<endl;
	//--------string转char[]--------
	sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
	string name = "colinguan";
	char cname[200];
	sstr<<name;
	sstr>>cname;
	cout<<cname;
	system("pause");
}

string转double/int:

#include <iostream>
#include <sstream>
 
using namespace std;
 
int main()  
{ 
     
    double  dVal;    
    int     iVal;
    string  str;
    stringstream ss;
    
    // string -> double
    str = "123.456789";  
    ss << str;
    ss >> dVal;
    cout << "dVal: " << dVal << endl;
 
    // string -> int
    str = "654321";  
    ss.clear();
    ss << str;
    ss >> iVal;
    cout << "iVal: " << iVal << endl;  
        
    return 0;  
}  

4.2 stringstream用于空格分割的字符串的切分

LeetCode:557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:

输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc" 

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

class Solution { 
   
public:
    string reverseWords(string s) { 
   
        //使用C++的stringstream类和,string的reverse函数
        if(s.size() == 0)
            return "";
        stringstream ss;
        ss << s;
        string p,str;
        while(ss >> p){ 
   
            reverse(p.begin(), p.end()); //string 可以调用reverse函数,string的表现像一个vecor<char>
            str = str + p + ' ';
        }
        string ans(str.begin(), str.begin()+str.size()-1);
        return ans;
    }
};

原文链接:

  1. C++ stringstream 类的用法
  2. C++ stringstream介绍,使用方法与例子
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141948.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • QCustomPlot系列(5)-实时动态曲线[通俗易懂]

    QCustomPlot系列(5)-实时动态曲线[通俗易懂]先来个动图看看效果:支持鼠标平移、滚轮缩放、框选放大、取消框选、一键全显、单击显示xy坐标值。。等平移功能是QCustomPlot自带的功能,参见我的该系列前面的博文。框选放大、全显等功能在另一篇博文中也讲到了。这里只讲2个知识点:1、显示鼠标指向的点坐标,2、实时滚动1、箭头指向要显示的坐标点,代码步骤:(1)添加新类,继承QCustomPlot添加private成员变…

    2022年10月16日
  • Java编程的逻辑 (4) – 整数的二进制表示与位运算

    Java编程的逻辑 (4) – 整数的二进制表示与位运算

  • js addEventListener事件捕获与冒泡,第三个参数详解,阻止事件传播

    js addEventListener事件捕获与冒泡,第三个参数详解,阻止事件传播结论element.addEventListener(event,function[,useCapture])event:事件名称,如clickfunction:指定要事件触发时执行的函数,可以传入事件参数useCapture:可选。布尔值,指定事件是否在捕获或冒泡阶段执行。默认false:在冒泡阶段执行指定事件true:在捕获阶段执行事件event.stopPropagat…

  • Fiddler安装教程(图文版)「建议收藏」

    Fiddler安装教程(图文版)「建议收藏」本章教程,主要介绍如何在windows10系统上安装Fiddler。一、Fiddler软件简介二、软件官网地址三、图文下载步骤四、软件安装步骤五、结语一、Fiddler软件简介Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。Fiddler要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好…

    2022年10月22日
  • poetry下载_烘手器安装

    poetry下载_烘手器安装介绍Poetry是Python中的依赖管理和打包工具,当然它也可以配置虚拟环境。它允许您声明项目所依赖的库,并为您管理(安装/更新)它们。之前一直使用virtualenvwrapper管理虚拟

  • NVIC 中断优先级管理详解

    NVIC 中断优先级管理详解1.NVIC(内嵌向量中断控制器)NVIC:NestedVectoredInterruptController,STM32系列有84个中断,相对于的开发板STM32F103系统

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号