C++中数据类型转换

1.stringstream简介

  C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。
(1)istringstream类用于执行C++风格的串流的输入操作。
(2)ostringstream类用于执行C风格的串流的输出操作。
(3)strstream类同时可以支持C风格的串流的输入输出操作。
  istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和stringstreambase派生而来,stringstream则是从iostream类和stringstreambase派生而来。
  他们的继承关系如下图所示:
  
  字符串流继承关系图
  

2.stringstream用于字符串分割

  我之前写了一篇C++中将string按照空白字符分割的新方法中就是用到stringstream来对字符串分割的,这里介绍一种更常见的方法。
  例如将字符串“123.12.3.2.1.2”按照“.”进行分割,得到分割后的整数。代码如下:

/**************************************************************

Copyright:武汉大学计算机学院B507

Author: Ryan

Date:2015-10-20

Description:按照给定模式切割字符串

**************************************************************/

#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
/*
* Summary: 按照给定的模式切割字符串
* Parameters:
*     s:给定的字符串
*     pattern:模式 
* Return: 存储切割后字符串的vector<int>
*/
vector<int> convert(string& s,string pattern){
    stringstream ss;
    vector<int> res;
    s+=".";
    int j;
    int size=s.size();
    for(int i=0;i<size;i++){
        //这行代码非常总要,解决复用问题
        ss.clear();     
        j = s.find(pattern,i);
        string sub = s.substr(i,j-i);
        //清空缓冲区
        ss.str("");
        ss.str(sub);
        int num;
        ss >> num;
        res.push_back(num);
        i=j+pattern.size()-1;
    }
    return res;
}

int main(){
    string s="123.12.3.2.1.2";
    string p = ".";
    vector<int> res = convert(s,p);
    cout<<"["<<" ";
    for(int i=0;i<res.size();i++){
        cout<<res[i]<<" ";
    }
    cout<<"]"<<endl;

    return 0;
}

运行结果如下图所示:

这里写图片描述

如果去掉代码中的ss.clear();这一行,运行结果如下:

这里写图片描述

在多次用到stringstream的同一对象时,一定要进行clear()操作,避免复用。

3.stringstream用于数据类型转换

(1)string类型转换成int类型(double类型也同样适合)

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

int main(){
    string s="123";
    int res;
    //用s初始化字符串流对象ss
    stringstream ss(s);
    ss>>res;
    cout<<"res:"<<res<<endl;    
    return 0;
}

运行结果如下:

这里写图片描述

代码中也可以先定义一个流对象,然后将s输入到流对象中,

stringstream ss;
ss << s;

等同于上面代码中的

stringstream ss(s);

(2)int类型转string类型

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

int main(){
    int a = 123;
    string res;
    //切记这里不能用a来初始化ss,因为a是int类型的
    stringstream ss;
    ss<<a;
    ss>>res;
    cout<<"res:"<<res<<endl;    
    return 0;
}

运行结果:

这里写图片描述

4.总结

  stringstream能很方便地用于数据类型转换和字符串分割,但是使用过程中一定要注意一些问题,比如clear()方法解决复用问题,.str(“”)清空缓冲区之类的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值