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

文章介绍了C++标准库中的sstream类,包括istringstream用于输入,ostringstream用于输出,stringstream支持输入输出。sstream类主要用于安全的数据类型转换,避免缓冲区溢出,且能自动推导类型。文中提供了将int转为string、字符串拼接以及sstream的清空方法的代码示例。另外,还展示了istringstream如何按空格分隔字符串,以及ostringstream在动态格式化字符串时的便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

定义了三个类: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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值