百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

C++中stringstream简介,使用方法详解和举例

bigegpt 2024-10-30 01:53 5 浏览

C语言中,将一个整形变量转换为字符串类型,方法有

  • _itoa_s()函数
  • sprintf_s()函数

例子:

#include <iostream>
using namespace std;
int main()
{
	int n = 123456;
	char s1[32];
	_itoa_s(n, s1, 10);//最后一个参数表示需要多少空间
	cout << "s1 = " << s1 << endl;
	char s2[32];
	//sprintf就是相当于将打印到屏幕的字符串打印到用户给的空间
	sprintf_s(s2, "%d", n);
	cout << "s2 = " << s2 << endl;
	char s3[32];
	sprintf_s(s3, "%f", n);//将int转换成浮点数的时候会出错(把n这个空间看成浮点数)
	cout << "s3 = " << s3 << endl;
	return 0;
}

上面这两个函数的转换方法,先给出保存结果的空间,那空间大小不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。

C++中,可以使用stringstream类对象,解决上述问题

要点:1、必须包含头文件#include<sstream> 包含三个类:istringstream、ostringstream、stringstream 。

例子:

1、将数值类型转换为字符串类型

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
#include<sstream>
int main()
{
	int a = 12345678;
	string str1;
	// 将一个整型变量转化为字符串,存储到string类对象中
	stringstream s;
	s << a;
	s >> str1;
	// 将stringstream底层管理string对象设置成"",
	// 否则多次转换时,会将结果全部累积在底层string对象中
	s.str("");
	cout << str1 << endl;
	s.clear();// 清空s, 不清空会转化失败
	double d = 12.34;
	s << d;
	s >> str1;
	cout << str1 << endl;
	string sValue;
	//这个方法会把管理的整个string对象返回,不会受读/写指针的影响
	sValue = s.str();// str()方法:返回stringsteam中管理的string类型
	cout << sValue << endl;
	return 0;
}

2、字符串拼接

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

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

3、用stringstream可以用指定字符分割字符串

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

int main() {
    string data = "1_2_3_4_5_6";
    stringstream ss1(data);
    string item;
    cout << data << endl;
    while (getline(ss1, item, '_'))
        cout << item << ' ';
}

总结:

  • stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
  • 多次类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将
    stringstream底层的string对象清空。
  • 使用s. str("")方法将底层string对象设置为""空字符串。
  • 使用s.str()将让stringstream返回其底层的string对象。
  • stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参
    数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

4、stringstream中的.clear().str()的理解

当重复使用同一个stringstream对象时,先用.str("")方法清除缓存,再用.clear()方法重设状态,否则对stringstream对象的操作是无效的stringstream流就像是一个文件,而且就像是有自己的读写位置指针。

#include<iostream>
#include<vector>
#include<sstream>
using namespace std;
int main()
{
    string str;
    while (getline(cin, str))
    {
        vector<int> v;
        stringstream ss(str); //(1)
        int inter;
        char ch;
        while (ss >> inter)//(2)
        {
            v.push_back(inter);
            ss >> ch;//读取逗号
        }
        ss.clear();
        ss.str("");
        getline(cin, str);
        ss.clear();
        ss << str;
        cout << "str本身的值是:" << ss.str() << endl;
        while (ss >> inter)//(3)
        {
            cout << inter << " ";
        }
    }
    return 0;
}

输出


ss.str("")注释掉,输出为:


注释掉ss.str(""),更改一下输入:


结果说明ss流在(2)处while循环之后,其读指针(从流中读)已经在流开始的第2个位置处(从0位置开始数),而我们流的初始化时使用的stringstream ss(str)的方式,其写指针(写到流中)还是在流的开头,当我们写入两个数据时,并没有在读指针的位置写下有效数据,所以标号(3)的输出为空,当我们写入三个数据,即在读指针的位置处写下数字5,输出:5。

  • 当使用ss.str("");时相当于将流变成了一个类似于新创建的干净的流,相当于把读指针和写指针都归0,字符串清空
  • 即使标号(2)处跳出了循环,此时再次使用ss.str(),发现会输出值:6,7,即stringstream和cin不同,它并不清空流中的数据 ,只是在移动读写指针
  • 在使用流时,要注意读写指针的位置,在创建流之后, 不要进行(1)处的初始化,而是拆分为两条语句:stringstream ss; ss << str;

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...