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)
blank

相关推荐

  • java python oracle推断字符串是否为数字的函数

    java python oracle推断字符串是否为数字的函数

  • Dronekit代码学习(三)控制无人机前后左右升降俯仰

    Dronekit代码学习(三)控制无人机前后左右升降俯仰Dronekit代码学习(三)控制无人机前后左右升降俯仰控制无人机前后左右升降俯仰代码如下:起飞5m后,右5m,前方5m,升2m,返航,关闭连接升降是反的#-*-coding:utf-8-*-”’—————————————————————————控制无人机前后左右升降俯仰…

  • googlenet网络结构图_代码架构

    googlenet网络结构图_代码架构前言七夕了,看着你们秀恩爱,单身狗的我还是做俺该做的事吧!在上一篇文章中介绍了VGG网络结构,VGG在2014年ImageNet中获得了定位任务第1名和分类任务第2名的好成绩,而同年分类任务的第一名则是GoogleNet。GoogleNet是Google研发的深度网络结构,之所以叫“GoogLeNet”,是为了向“LeNet”致敬,有兴趣的同学可以看下原文GoingDeeperwithConvolutions。与VGGNet模型相比较,GoogleNet模型的网络深度已经达到了22层(

  • mybatis trim标签

    mybatis trim标签mybatis的trim标签一般用于动态sql语句中去除多余的and关键字,逗号等以下是trim标签中涉及到的属性:属性描述prefix给sql语句拼接的前缀suffix给sql语句拼接的后缀prefixOverrides去除前缀suffixOverrides去除后缀案例trim实现insert into ()values()<insert id=”insert” parameterType=”InfoStudent”> .

  • 5500xt挖矿算力_rx470d etc算力

    5500xt挖矿算力_rx470d etc算力…每日平均收益为R$4。RX5700XT表现出色的其他加密货币包括:以太坊经典(ETC),拉文币(RVN),天堂协议XHV和Beam(BEAM)。可以用于采矿的同一系列图形卡中的其他型号是RX5700,RX5600XT和RX5500XT。但是,与RX5700XT相比,这些其他型号的利润率较低。NvidiaRTX2060超级频率:1470MHz至1670MHzV…

发表回复

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

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