用标准c++实现string与各种类型之间的转换
要实现这个目标,非stringstream类莫属。
这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。
简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。
示例1示范怎样使用一个stringstream对象进行从 string到int类型的转换 注意,使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
示例1:
std::stringstream stream;
string result="10000";
int n = 0;
stream << result; stream >> n;//n等于10000
int到string类型的转换
string result;
int n = 12345;
stream << n;
result =stream.str();// result等于"12345"
重复利用stringstream对象 如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法,在多次转换中重复使用同一个 stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU 时间的。经试验,单单使用clear()并不能清除stringstream对象的内容,仅仅是了该对象的状态,要重复使用同一个 stringstream对象,需要使用str()重新初始化该对象。
示例2:
std::stringstream strsql;
for (int i= 1; i < 10; ++i)
{
strsql << "insert into test_tab values(";
strsql << i << ","<< (i+10) << ");";
std::string str = strsql.str();// 得到string
res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
std::cout << strsql.str() << std::endl; strsql.clear();
strsql.str("");
}
转换中使用模板 也可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。
例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。
to_string()函数将t转换为字符串并写入result中。
使用str()成员函数来获取流内部缓冲的一份拷贝:
示例3:
template void to_string(string & result,const T& t)
{ ostringstream oss;//创建一个流 oss< out_type convert(const in_value & t)
{ stringstream stream; stream<>result;//向result中写入值 return result; }
这样使用convert(): double d; string salary; string s=”12.56”; d=convert(s);//d等于12.56 salary=convert(9000.0);//salary等于”9000”
结论:在过去留下来的程序代码和纯粹的C程序中,传统的形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于 stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃而使用< sstream>。
当然现在还有一个更好的选择,那就是使用boost库中的lexical_cast,它是类型安全的转换。
如下例:
#include #include #include #include #include
using namespace std;
using namespace boost;
int main(void)
try
{
//以下是内置类型向string转换的解决方案
//lexical_cast优势明显
int ival;
char cval;
ostringstream out_string;
string str0;
string str1;
ival = 100;
cval = 'w';
out_string << ival << " " << cval;
str0 = out_string.str();
str1 = lexical_cast(ival) + lexical_cast(cval);
cout << str0 << endl; cout << str1 << endl;
//以下是string向内置类型转换的解决方案
//几乎和stringstrem相比,lexical_cast就是类型安全的,
int itmpe;
char ctmpe;
str0 = "100k";
str1 = "100h";
istringstream in_string( str0 );
in_string >> itmpe >> ctmpe;
cout << itmpe << " " << ctmpe << endl;
itmpe = lexical_cast(str1);
ctmpe = lexical_cast(str1);
system( "PAUSE" );
return 0;
} catch(bad_lexical_cast e)
{ cout << e.what() << endl; cin.get(); }
相关文章
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
- 这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
- 今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下把普通照片快速转换成卡通效果的教程,各位想知道具体制作步骤的使用者们,那么下面就快阿里跟着小编一起看一...2016-09-14
mybatis 返回Integer,Double,String等类型的数据操作
这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-25- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 本篇文章是对C#中数据类型转换的几种形式进行了详细的分析介绍,需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
- 这篇文章主要为大家详细介绍了JavaScript实现数据类型的相互转换,感兴趣的朋友可以参考一下...2016-03-09
- 这篇文章主要介绍了JavaScript实现Base64编码转换的相关资料,非常简单实用,需要的朋友可以参考下...2016-04-25
PHP编码转换函数mb_convert_encoding与iconv用法
文章来实现一个PHP编码转换函数mb_convert_encoding与iconv用法,希望例子能帮助到各位。 将一个短信接口代码从apache迁移到nginx+php-fpm后,发现无法发出短信了,查...2016-11-25- 这篇文章主要介绍了c#的类型转换详解,类型转换分两种形式:隐式转换、显示转换,下面是详细介绍...2020-06-25
java中JSONObject转换为HashMap(方法+main方法调用实例)
这篇文章主要介绍了java中JSONObject转换为HashMap(方法+main方法调用实例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-14- 这篇文章主要介绍了C#将数字转换成字节数组的方法,涉及C#字符串操作的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 本文给大家分享了C# 中string.split用法的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2020-06-25
JSON字符串转换JSONObject和JSONArray的方法
这篇文章主要介绍了JSON字符串转换JSONObject和JSONArray的方法的相关资料,需要的朋友可以参考下...2016-06-12- 用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些 代码如下 复制代码 ...2016-11-25
photoshop把照片转换为铅笔素描画人像效果后期处理教程
今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说把照片转换为铅笔素描画人像效果的后期处理教程,各位想知道具体的后期处理方法的使用者们,那么大家...2016-09-14