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介绍,使用方法与例子
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql explain ref null_MySQL Explain详解[通俗易懂]

    mysql explain ref null_MySQL Explain详解[通俗易懂]MySQLExplain详解简介执行计划(queryExecutionplan)语法explainselect*fromtableexplain中的列expain出来的信息有10列,分别是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra,下面对这些字段出现的可能进行解释:一、I…

    2022年9月18日
    0
  • Pycharm连接并调用服务器「建议收藏」

    Pycharm连接并调用服务器「建议收藏」Pycharm可以与服务器建立连接,把相应的项目同步到服务器上,并且可以通过Pycharm直接使用服务器的解释器运行相应程序,实现Pycharm编程,服务器运行的效果。具体步骤如下:1.建立一个服务器连接Pycharm的“Tools”-》“Deployment”-》“Configuration”2.创建一个SFTP3.为该项目添加一个SSH解释器。因为前面已经添加好了服务器连接,所以这里直接选择已经设置好的就可以,如果没有已经设置好的,可以重新添加。配置好SSH之后,选择Next,设置本地项目

    2022年8月28日
    0
  • 自动化运维平台Spug介绍

    自动化运维平台Spug介绍一、概要Spug是一款使用Python+Flask+Vue+Element组件开发的开源运维管理系统,系统前后端分离,项目创建于2017年,2018年2月第一个开源运维平台版本发布,设计为面向中小型企业设计的轻量级无Agent的自动化运维平台,UI基于AntDesign设计,整合了主机管理、主机批量执行、主机在线终端、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能,且二次开发很方便。它采用授权协议AGPL-3.0,使用开发语言PythonJavaScript;软件采用无Agen

    2022年5月13日
    55
  • linux 挖矿效率_以太坊(ETH)怎么挖矿?LinuxETH系统挖矿教程「建议收藏」

    linux 挖矿效率_以太坊(ETH)怎么挖矿?LinuxETH系统挖矿教程「建议收藏」Geth客户端的CPU挖矿效率非常低,纯属鸡肋。如对CPU挖矿感兴趣,请参照本文。下面介绍GPU挖矿。硬件GPU挖矿需要1-2GB显存(译者注:1GB显存不可以),显存不够会一直报错。GPU矿机是基于OpenCL的,所以AMD显卡比NVIDI显卡更有效率。ASIC和FPGA(即专业矿机)是无效的。根据自己的显卡类型和系统,选择openCL:AMDSDKopenCLNVIDIACUDAope…

    2022年10月15日
    0
  • NSGA2算法MATLAB

    NSGA2算法MATLABNSGA2算法MATLAB实现(能够自定义优化函数)以前写了一个简单的NSGA2的算法能够用在ZDT1函数上:http://www.omegaxyz.com/2017/05/04/nsga2matlabzdt1/那个NSGA2的算法不具有普遍性,下面参考课国外的课题小组的代码重新修改了内部冗余内容,使之能够自定义优化函数。更多内容访问omegaxyz.comNSGA2的过程为:

    2022年5月12日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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