写在前面:之前一直都很习惯使用中的格式转换,但是很不方便,做题的时候用起来很容易出错,今天系统总结一下c++中的用法
- 首先来认识一下std::basic_stringstream
类模板 std::basic_stringstream 实现基于字符串的流上的输入与输出操作。它等效地存储一个 std::basic_string 的实例,并在其上进行输入与输出操作。定义域头文件
在底层,该类实际上包装 std::basic_stringbuf 的未处理字符串设备到 std::basic_iostream 的高层接口中。提供到独有 std::basic_stringbuf 成员的完整接口。 - 库中声明的标准类是自动选择所必需的转换。而且, 转换结果保存在stringstream对象的内部缓冲中。不必担心缓冲区溢出,因为这些对象会根据需要自动分配存储空间。
- 库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另 外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。
注意,使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。 - 重复利用stringstream对象中需要注意的,如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
- 接下来是测试用例,包括string和int之间的转换以及算法中经常用到的如何将一个包含空格的string以空格为间隔分别输出。
#include <iostream>
#include <cstdio>
#include <sstream>
#include <string>
#include <typeinfo> //输出类型
using namespace std;
int main()
{
string s="1000";
int a=0;
stringstream ss;
//string 到int的转换
ss<<s;
ss>>a;
cout<<a<<" a的类型是"<<typeid(a).name()<<endl;
ss.clear(); //清除ss中的内容以便再次使用
//int 到string的转换
int b=2000;
string s1;
ss<<b;
ss>>s1;
cout<<b<<" b的类型是"<<typeid(b).name()<<endl;
ss.clear();
string s2="你好啊 我是 哈哈";
string buf;
ss<<s2;
while (ss>>buf) cout<<buf<<endl;
return 0;
}