【c++】数据类型转换方式sstream的使用方法

概述

定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。

istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
stringstream类同时可以支持C风格的串流的输入输出操作。

主要用来进行数据类型转换,由于 使用 string 对象来代替字符数组(snprintf方式),就避免缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言, 更加安全、自动和直接。

stringstream

数据类型转换

这里展示一个代码示例,该示例介绍了将 int 类型转换为 string 类型的过程。示例代码(stringstream_test1.cpp)如下:

#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int main()
{
    stringstream sstream;
    string strResult;
    int nValue = 1000;
 
    // 将int类型的值放入输入流中
    sstream << nValue;
    // 从sstream中抽取前面插入的int类型的值,赋给string类型
    sstream >> strResult;
 
    cout << "[cout]strResult is: " << strResult << endl;
    printf("[printf]strResult is: %s\n", strResult.c_str());
 
    return 0;
}

多个字符串拼接

本示例介绍在 stringstream 中存放多个字符串,实现多个字符串拼接的目的(其实完全可以使用 string 类实现),同时,介绍 stringstream 的清空方法。

示例代码(stringstream_test2.cpp)如下:

#include <string>
#include <sstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    stringstream sstream;
 
    // 将多个字符串放入 sstream 中
    sstream << "first" << " " << "string,";
    sstream << " second string";
    cout << "strResult is: " << sstream.str() << endl;
 
    // 清空 sstream
    sstream.str("");
    sstream << "third string";
    cout << "After clear, strResult is: " << sstream.str() << endl;
 
    return 0;
}

stringstream的清空

清空 stringstream 有两种方法:clear() 方法以及 str(“”) 方法,这两种方法有不同的使用场景。str(“”) 方法的使用场景,在上面的示例中已经介绍了,这里介绍 clear() 方法的使用场景。示例代码(stringstream_test3.cpp)如下:

#include <sstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    stringstream sstream;
    int first, second;
 
    // 插入字符串
    sstream << "456";
    // 转换为int类型
    sstream >> first;
    cout << first << endl;
 
    // 在进行多次类型转换前,必须先运行clear()
    sstream.clear();
 
    // 插入bool值
    sstream << true;
    // 转换为int类型
    sstream >> second;
    cout << second << endl;
 
    return 0;
}

istringstream

用法:istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。

example1:

#include<iostream>  
#include<sstream>        //istringstream 必须包含这个头文件
#include<string>  
using namespace std;  
int main()  
{  
    string str="i an a boy";  
    istringstream is(str);  
    string s;  
    while(is>>s)  
    {  
        cout<<s<<endl;  
    }  

} 
输出是:
i
am
a
boy

example2:

string s;
getline(cin,s);
istringstream is(s);
string tmp;
while(getline(is,tmp,' '))
{
    cout<<tmp<<endl;
}

ostringstream

有时候,我们需要格式化一个字符串,但通常并不知道需要多大的缓冲区。为了保险常常申请大量的缓冲区以防止缓冲区过小造成字符串无法全部存储。这时我们可以考虑使用ostringstream类,该类能够根据内容自动分配内存,并且其对内存的管理也是相当的到位。

#include <sstream>
#include <string>
#include <iostream>
using namespace std;
 
void main()
{
	ostringstream ostr1; // 构造方式1
	ostringstream ostr2("abc");	// 构造方式2
 
/*----------------------------------------------------------------------------
*** 方法str()将缓冲区的内容复制到一个string对象中,并返回
----------------------------------------------------------------------------*/
	ostr1 << "ostr1" << 2012 << endl;	// 格式化,此处endl也将格式化进ostr1中
	cout << ostr1.str(); 
 //output:ostr1 2012
    
/*----------------------------------------------------------------------------
*** 建议:在用put()方法时,先查看当前put pointer的值,防止误写
----------------------------------------------------------------------------*/
	long curPos = ostr2.tellp(); //返回当前插入的索引位置(即put pointer的值),从0开始 
	cout << "curPos = " << curPos << endl;
 //output:curPos = 0
    
	ostr2.seekp(2);	// 手动设置put pointer的值
	ostr2.put('g');		// 在put pointer的位置上写入'g',并将put pointer指向下一个字符位置
	cout << ostr2.str() << endl;
//output:abg	
 
/*----------------------------------------------------------------------------
*** 重复使用同一个ostringstream对象时,建议:
*** 1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit);
*** 2:调用str("")将缓冲区清零,清除脏数据
----------------------------------------------------------------------------*/
	ostr2.clear();
	ostr2.str("");
 
	cout << ostr2.str() << endl;
    //output:
	ostr2.str("_def");
	cout << ostr2.str() << endl;
    //output:_def
	ostr2 << "gggghh";	// 覆盖原有的数据,并自动增加缓冲区
	cout << ostr2.str() << endl;
    //output:gggghh
    ostr2.str("");   // 若不加这句则运行时错误,因为_df所用空间小于gggghh,导致读取脏数据
    ostr2.str("_df");  
    cout << ostr2.str() << endl;
 
    // 输出随机内存值,危险
    const char* buf = ostr2.str().c_str();  
    cout << buf << endl;
 
    // 正确输出_df
    string ss = ostr2.str();
    const char *buffer = ss.c_str();
    cout << buffer << endl;

}
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
06-01
sstreamC++标准库中的一个类,它提供了将字符串作为流来处理的功能。我们可以使用sstream来进行字符串的输入输出,以及字符串和其他类型的转换。其中,stringstream继承自iostream类,因此它可以使用iostream中的输入输出操作符(<<和>>),也可以使用iostream中的流操作(如getline函数)。 使用stringstream时,我们需要先创建一个stringstream对象,并将需要处理的字符串传递给它。然后,我们可以使用iostream中的输入输出操作符或流操作来对字符串进行处理。例如: ```c++ #include <sstream> #include <iostream> #include <string> using namespace std; int main() { stringstream ss("123 4.56"); // 创建一个stringstream对象,并初始化为"123 4.56" int num; double dbl; ss >> num >> dbl; // 从stringstream中读取数据到变量num和dbl中 cout << "num = " << num << ", dbl = " << dbl << endl; stringstream ss2; ss2 << "Hello, " << "world!"; // 将字符串拼接到stringstream中 string str; getline(ss2, str); // 从stringstream中读取拼接后的字符串 cout << str << endl; return 0; } ``` 输出结果为: ``` num = 123, dbl = 4.56 Hello, world! ``` 在这个例子中,我们首先创建了一个stringstream对象,并将其初始化为"123 4.56"。然后,我们使用iostream中的输入操作符(>>)将stringstream中的数据读取到变量num和dbl中。接下来,我们创建了另一个stringstream对象,并使用iostream中的输出操作符(<<)将字符串拼接到stringstream中。最后,我们使用iostream中的流操作(getline函数)从stringstream中读取拼接后的字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值