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;
}

运行结果如下图所示:

C++中数据类型转换_第1张图片

如果去掉代码中的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(“”)清空缓冲区之类的。

你可能感兴趣的:(C++,数据类型转换,字符串切割,sstrream)