天天看点

c++ stringstream简单实现string与int/double转换

一些高级语言比如py,他们的数据类型之间的转换,都拥有灵活而便利的特性,然而c++也提供了一些方便的辅助库,今天来学习stringstream,字符串流在变量类型转换中的应用,这使得编程的速度,大大的提高了

流的概念

说到流,最常用的就是iostream 即 input / output stream 输入输出流,回想我们是怎样使用流的?

cout<<a;	// 向输出流中添加数据a
cin>>b;		// 读取输入流的数据到b
           

箭头的朝向(即移位运算符的方向)决定了数据的流向,而

cout<<a;

显然是向输出流中添加数据a,

cin>>b;

是读取输入流的数据到b

可以把流理解成一个“队列”,最后我们添加的东西会按顺序相应的被输出,或者是变量按顺序被读取,这和我们的认知是相同的

流的弱类型

在一句 cout 里面,我们可以输入任意数据类型,最后他们都会恰当的被转化到屏幕上面,这是一个好特性

那么有没有一种流,可以输入字符串,输出整数,或者是输入整数,输出字符串呢,这样就可以摒弃itoa或者atoi了,答案是

stringstream

stringstream的使用

利用stringstream对象,可以灵活的读入任意类型数据(数字类型和string),输出任意类型数据,实现数据类型的转化

栗子:int转string

可以简单地向字符流中加入数据,然后以另一类型从字符流中读取数据,以完成转化,string转int同样可以用类似的操作实现

using namespace std;
stringstream ss;
	
int x = 114514;
string str;

ss<<x;		// 向字符流中加入 x 
ss>>str;	// 从字符流中以string类型的形式取数据 
 
cout<<str<<endl;

// 代码的执行结果是 114514
           

流的复用

上文提到,因为流类似队列,一个流一旦被打开,他会保存之前加入过的数据,稍有不慎就会因为旧的数据的影响,而导致转化的失败,最好的习惯是每次复用流对象之前,调用clear方法,清空流,再加入新数据,或者是申请新的stringstream对象也是可以的

下面这个例子展示了错误的转换

using namespace std;
stringstream ss;
	
int res;

ss<<114;		
ss<<514;	
ss>>res;

cout<<res<<endl;

// 运行结果:114514
           

用clear方法来复用流对象

运行结果:

#include <bits/stdc++.h>

using namespace std;

int main()
{ 	
	stringstream ss;

	int n1;
	double n2;
	string n3, n4;
	
	// string 转 int / double 
	ss.clear();
	ss<<"123";
	ss>>n1;
	
	ss.clear();
	ss<<"456.789";
	ss>>n2;
	
	// int / double 转string
	ss.clear(); 
	ss<<114514;
	ss>>n3;
	
	ss.clear();
	ss<<1919.81;
	ss>>n4;
	
	cout<<n1<<" "<<n2<<" "<<n3<<" "<<n4<<endl;
	
	return 0;
}
           

继续阅读