C++ stringstream

参考:http://www.usidcbbs.com/read-htm-tid-1898.html


常见格式串

%% 印出百分比符号,不转换。
%c 整数转成对应的 ASCII 字元。
%d 整数转成十进位。
%f 倍精确度数字转成浮点数。
%o 整数转成八进位。
%s 整数转成字符串。
%x 整数转成小写十六进位。
%X 整数转成大写十六进位。
%n sscanf(str, "%d%n", &dig, &n),%n表示一共转换了多少位的字符

sprintf函数

sprintf函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串,具体功能如下所示:
  (1)将数字变量转换为字符串。
  (2)得到整型变量的16进制和8进制字符串。
  (3)连接多个字符串。

int main(){char str[256] = { 0 };int data = 1024;//将data转换为字符串sprintf(str,"%d",data);//获取data的十六进制sprintf(str,"0x%X",data);//获取data的八进制sprintf(str,"0%o",data);const char *s1 = "Hello";const char *s2 = "World";//连接字符串s1和s2sprintf(str,"%s %s",s1,s2);cout<<str<<endl; return 0;
} 
sscanf函数

sscanf函数原型为int sscanf(const char *str, const char *format, ...)。
将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内。具体功能如下:
  (1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。
  (2)取指定长度的字符串
  (3)取到指定字符为止的字符串
  (4)取仅包含指定字符集的字符串
  (5)取到指定字符集为止的字符串
  当然,sscanf可以支持格式串"%[]"形式的,有兴趣的可以研究一下。

int main(){char s[15] = "123.432,432";int n;double f1;int f2;sscanf(s, "%lf,%d%n", &f1, &f2, &n);cout<<f1<<" "<<f2<<" "<<n;return 0;
} 
输出结果:123.432 432 11, 即一共转换了11位的字符。

stringstream类

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

  1. istringstream类: 用于执行C++风格的串流的输入操作。         

        2. ostringstream类:用于执行C风格的串流的输出操作。

        3. strstream类:        同时可以支持C风格的串流的输入输出操作。stringstream s; s.str("");

istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和 stringstreambase派生而来, stringstream则是从iostream类和stringstreambase派生而来。


istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。
istringstream的构造函数原形如下: istringstream::istringstream(string str);

#include <iostream>  
#include <sstream>  using namespace std;  int main()  
{  istringstream istr;  istr.str("1 56.7");  //上述两个过程可以简单写成 istringstream istr("1 56.7");  cout << istr.str() << endl;  int a;  float b;  istr >> a;  cout << a << endl;  istr >> b;  cout << b << endl;  return 0;  
}  
上例中,构造字符串流的时候,空格会成为字符串参数的内部分界,例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。
  str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)。

ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。
ostringstream的构造函数原形如下: ostringstream::ostringstream(string str);

#i nclude <iostream> 
#i nclude <sstream> 
#i nclude <string> 
using namespace std; 
int main()   
{ 
ostringstream ostr; //ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结        尾开始增加,而是修改原有数据,超出的部分增长 
ostr.put('d'); 
ostr.put('e'); 
ostr<<"fg"; string gstr = ostr.str(); cout<<gstr; 
system("pause"); 
}
在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值 得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。
[ basic_stringbuf::str :
Sets or gets the text in a string buffer without changing the write position. ]

stringstream的构造函数原形如下:stringstream::stringstream(string str);

#i nclude <iostream> 
#i nclude <sstream> 
#i nclude <string> 
using namespace std; int main()   
{ 
stringstream ostr("ccc"); 
ostr.put('d'); 
ostr.put('e'); 
ostr<<"fg"; 
string gstr = ostr.str(); 
cout<<gstr<<endl; char a; 
ostr>>a; 
cout<<a system("pause"); 
}
//除此而外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。 示例代码如下:
#i nclude <iostream> 
#i nclude <sstream> 
#i nclude <string> 
using namespace std; int main()   
{ 
stringstream sstr; 
//--------int转string----------- 
int a=100; 
string str; 
sstr<<a; 
sstr>>str; 
cout<<str<<endl; 
//--------string转char[]-------- 
sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。 
string name = "colinguan"; 
char cname[200]; 
sstr<<name; 
sstr>>cname; 
cout<<cname; 
system("pause"); 
}

实现任意类型的转换

    template<typename out_type, typename in_value>out_type convert(const in_value & t){stringstream stream;stream<<t;//向流中传值out_type result;//这里存储转换结果stream>>result;//向result中写入值return result;}

示例代码

#include <iostream>
#include <sstream>using namespace std;void test_stringstream_1(void)
{string result="10000";stringstream stream;int n=0;stream << result;stream >> n; //n等于10000cout << n << endl;
}void test_stringstream_2()
{string s;stringstream ss;int n, i, sum, a;cin >> n;getline(cin, s); // 读取换行for (i=0; i<n; i++){getline(cin, s);ss.clear();ss.str(s);sum=0;while (1){ss >> a;if ( ss.fail() ) break;sum+=a;}cout << sum << endl;}
}template<typename T>
void to_string(string & result, const T& t)
{/*输入流、输出流 都是从内存的角度看的,从内存出去叫 输入流,从来到内存叫输入流数据从 内存 到 流 里面 是数据流出,*/ostringstream oss;//创建一个流oss << t; //把值传递到流中result = oss.str();//获取转换后的字符转并将其写入result
}template<class out_type,class in_value>
out_type convert(const in_value & t)
{stringstream stream;stream<<t; //向流中传值out_type result; //这里存储转换结果stream>>result; //向result中写入值return result;
}int main(void)
{test_stringstream_1();test_stringstream_2();string s1,s2,s3;to_string(s1,10.5);//double到stringto_string(s2,123);//int到stringto_string(s3,true);//bool到stringcout<<s1<<endl<<s2<<endl<<s3<<endl;double d;string salary;string s = "12.56";d = convert<double>(s); //d等于12.56salary = convert<string>(9000.0); //salary等于"9000"cout << d <<endl<<salary<<endl;std::stringstream stream_string;std::string res;int i = 1000;stream_string << i; //将int输入流stream_string >> res; //从stream中抽取前面插入的int值std::cout << res << std::endl; // print the string "1000"std::stringstream stream_char;char chArray[8] ;stream_char << 8888; //向stream中插入8888stream_char >> chArray; //抽取stream中的值到resultstd::cout << chArray << std::endl; // 屏幕显示 "8888"/*重复利用stringstream对象如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法。在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。*/std::stringstream stream;int first, second;stream<< "456"; //插入字符串stream >> first; //转换成intstd::cout << first << std::endl;/*如果需要把格式化后的字符串通过>>输出到字符串, 必须每次都调用clear()方法!所以, 保险期间, 每次缓冲区格式化后, 都通过clear(), str("") 两个函数都调用, 把stingstream类复位.str() 和 str("") 的区别:str() 是返回内部缓冲区的一个copy, str("") 是清空内部缓冲区.*/stream.clear();//清除错误标志.在进行多次转换前,必须清除streamstream.str("");//清除内容。stringstream类内部的缓冲区正确的清空方式。stream << true; //插入bool值stream >> second; //提取出intstd::cout << second << std::endl;return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java并发编程实战~思维导图

#原图 System.out.println("https://www.processon.com/view/link/61a235be1efad425fd6ff5f6")

中国“脑计划”研究正在悄然布局

来源&#xff1a;中国科学报 作者&#xff1a;黄辛 作为“十三五”上海科研发展的重点&#xff0c;一张神奇的脑计划研究“地图”正在悄然加紧布局。日前&#xff0c;在教育部科技司、国家自然科学基金委员会政策局、华东师范大学主办的“交叉融合的教育科学基础研究”研讨会上…

JDBC链接SQLServer2005 Express

SQLServer2005的数据库链接的jar包可以到微软网站上去下载&#xff0c;驱动和链接字符串如下&#xff1a; 1: String driver "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 2: String url "jdbc:sqlserver://localhost:1433;databaseNamepubs"; SQLS…

dnf时装预览怎么打开_DNF:史上最好看时装上线,大佬已经玩疯,全服都是真香的气息...

大家好&#xff01;我是风柜君&#xff0c;这次又是我来给大家带来DNF游戏内外的趣事&#xff0c;希望各位喜欢。DNF国服将在6月18日迎来第11周年庆&#xff0c;而在此之前&#xff0c;国服在6月6日的时候已经更新了一波周年庆预热活动。这次的更新除了普雷妮普通副本以外&…

深度解析:AWS、谷歌云、IBM Cloud和微软 Azure四巨头2018将会有哪些布局?

来源&#xff1a; IDC圈近来&#xff0c;公司规模已经不再是企业选择云服务商的重要因素&#xff0c;市场对云服务商优劣的判断有了多种标准。企业对全球一些大型云计算服务商&#xff08;例如亚马逊AWS&#xff0c;谷歌云平台&#xff0c;IBM Cloud和微软 Azure等&#xff09;…

用法 stl_C++STL 容器篇

前言上一章节主要是详细介绍了C泛型编程基础&#xff0c;不清楚的可以回顾一下哦。本章节主要针对于CSTL(标准模板类库)做个详细介绍。标准模板类库也就是别人写的模板类&#xff0c;主要内容是各种数据结构的封装&#xff0c;以及常用算法。暂时分三个章节介绍&#xff0c;本章…

超级强大的 vim 配置(vimplus)

From : http://www.cnblogs.com/highway-9/p/5984285.html From : http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html From : http://www.cnblogs.com/youxia/p/linux002.html From : http://blog.csdn.net/namecyf/article/details/7787479 最近在重新配置Vim&a…

谷歌将屏蔽一切与加密货币相关的广告 6月正式生效

来源&#xff1a;腾讯证券北京时间3月14日下午消息&#xff0c;据外媒报道&#xff0c;谷歌开始对与加密货币相关的广告的进行打击。谷歌可持续广告业务负责人斯科特-斯宾塞&#xff08;Scott Spencer&#xff09;在接受CNBC采访时称&#xff0c;该公司正在调整与金融服务相关的…

ARM体系结构与汇编指令

可编程器件的特点 • CPU在固定频率的时钟控制下节奏运行。 • CPU可以通过总线读取外部存储设备中的二进制指令集&#xff0c;然后解码执行。 • 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的&#xff0c;是CPU的设计者&#xff08;ARM公司&#xff09;定义的&a…

微软宣布在机器翻译方面取得突破,中翻英可达人类水平

来源&#xff1a;猎云网一组微软研究团队于本周三宣布&#xff0c;他们已经创造了第一个能够将中文新闻翻译成英文的机器翻译系统&#xff0c;精确度与人类译者一致。该公司表示&#xff0c;它通过来自各种在线报纸的约2000条语句样本对这一系统进行了反复测试&#xff0c;并将…

pla3d打印材料密度_3D打印金属材料模型过程中常见问题

在金属3D打印过程中&#xff0c;可能会出现大量设备操作者试图避免的问题&#xff0c;包括孔隙、残余应力、致密度、翘曲、裂纹及表面光洁度等。下面我们来谈谈这几种常出现的问题。1、表面光洁度在金属3D打印件被使用或放置在展柜之前&#xff0c;它已经经历了大量类似CNC加工…

Java并发编程实战~ThreadLocal

ThreadLocal 的使用方法 static class SafeDateFormat {// 定义 ThreadLocal 变量static final ThreadLocal<DateFormat>tl ThreadLocal.withInitial(()-> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));static DateFormat get(){return tl.get();} }// …

智慧停车介绍、产业链市场全透析

来源&#xff1a;传感器技术最近&#xff0c;Goodwin调查发现&#xff0c;在城市地区&#xff0c;接近30%的交通拥堵源自于司机寻找停车位。据称&#xff0c;到2020年&#xff0c;将会有20亿的汽车在公路上跑着&#xff0c;这就意味着&#xff0c;届时汽车的数量将比目前多了7.…

Python 下载 图片、音乐、视频 和 断点续传

Python3 使用 requests 模块显示下载进度: http://blog.csdn.net/supercooly/article/details/51046561 python编写断点续传下载软件&#xff1a;https://www.leavesongs.com/PYTHON/resume-download-from-break-point-tool-by-python.html Python实现下载界面(带进度条&…

10停止nginx命令 win_Linux下配置Nginx并使用https协议

环境Centos7.6nginx-1.17.0下载官网&#xff1a;http://nginx.org/download/nginx-1.17.0.tar.gz环境确认在安装nginx前首先要确认系统中是否安装gcc、pcre-devel、zlib-devel、openssl-devel检查是否安装过软件包yum list installed | grep xxx安装软件包yum -y install gcc p…

腾讯AI Lab发布三大核心战略,与自然科研达成战略合作

来源&#xff1a;腾讯AI实验室3月15日&#xff0c;腾讯AI Lab第二届学术论坛在深圳举行&#xff0c;聚焦人工智能在医疗、游戏、多媒体内容、人机交互等四大领域的跨界研究与应用。全球30位顶级AI专家出席&#xff0c;对多项前沿研究成果进行了深入探讨与交流。本次论坛以“共享…

Java并发编程实战~Guarded Suspension模式

Guarded Suspension 模式 比如&#xff0c;项目组团建要外出聚餐&#xff0c;我们提前预订了一个包间&#xff0c;然后兴冲冲地奔过去&#xff0c;到那儿后大堂经理看了一眼包间&#xff0c;发现服务员正在收拾&#xff0c;就会告诉我们&#xff1a;“您预订的包间服务员正在收…

diy直立双足机器人_Aelos Pro 机器人:让编程变得更有趣

前言拥有一台酷炫的机器人是每个人儿时的梦想&#xff0c;爱搞机最近也有机会拿到一款来自乐聚的新品&#xff1a; Aelos Pro 机器人。相信有了解过机器人的朋友&#xff0c;应该对乐聚有所耳闻&#xff0c;乐聚在人形机器人领域一直都是行业的佼佼者&#xff0c;Aelos 系列机器…

中国科学家首次解析人脑“中央处理器”,领先美国脑计划

来源&#xff1a;澎湃新闻 作者&#xff1a;贺梨萍“我们可以探索数光年外的宇宙&#xff0c;但对我们两耳之间3磅重的大脑知之甚少。”这一想法推动美国前任总统奥巴马启动了“推进创新神经技术脑研究计划”&#xff0c;也就是所谓的 “脑计划”。中国同一领域内的研究也在加…

物理拓扑和逻辑拓扑——现实和应用的比较

在每一个网络管理者的脑子里几乎都有一张自己所管理的网络拓扑图。在网管系统中&#xff0c;生成拓扑图是网管系统的基本功能之一。目前&#xff0c;在网管系统中生成的的拓扑图分为物理拓扑和逻辑拓扑&#xff0c;他们有什么不同呢&#xff1f; 作为网络的管理者我们知道&…