`
gstarwd
  • 浏览: 1486701 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用标准C++进行string与各种内置类型数据之间的转换

阅读更多

要实现这个目标,非stringstream类莫属。这个类在<sstream>头文件中定义,
<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。示例1示范怎样使用一个stringstream对象进行从

string到int类型的转换

注意,<sstream>使用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<class T>

void to_string(string & result,const T& t)

{

 ostringstream oss;//创建一个流

oss<<t;//把值传递如流中

result=oss.str();//获取转换后的字符转并将其写入result
}

这样,你就和衣轻松地将多种数值转换成字符串了:

to_string(s1,10.5);//double到string

to_string(s2,123);//int到string

to_string(s3,true);//bool到string

可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:

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;

}

这样使用convert():

double d;

string salary;

string s=”12.56”;

d=convert<double>(s);//d等于12.56

salary=convert<string>(9000.0);//salary等于”9000”

结论

在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃<stdio.h>而使用<sstream>。

当然现在还有一个更好的选择,那就是使用boost库中的lexical_cast,它是类型安全的转换。如下例:

 #include <iostream>


#include <sstream>

#include <string>

#include <cstdlib>

#include <boost/lexical_cast.hpp>

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<string>(ival)

                    + lexical_cast<string>(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<int>(str1);

      ctmpe = lexical_cast<char>(str1);

       system( "PAUSE" );

       return 0;

}

catch(bad_lexical_cast e)

{

    cout << e.what() << endl;

    cin.get();

}       

发表于 @ 2006年03月26日 23:04:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:开源软件的许可证 | 新一篇:Access数据库的存储上限
相关文章 roger007 发表于2006年10月19日 22:06:00  IP:举报删除
使用STL实现C++所有数据类型转换为字符串型的to_string函数
及string 到其它数据类型的转换函数

1.数据类型转换为字符串型的to_string函数
template< class T>
inline std::string to_string( const T & Value)
{
std::stringstream streamOut;
streamOut << Value;
return streamOut.str( );
}

// 对原数据类型为string类型的特殊处理
template< >
inline std::string to_string( const std::string & Value)
{
return Value;
}

该函数对所有C++内有数据类型均适用。对支持“<<”运算符的类同样适用。

当然,实现与to_string功能相反的函数也是容易的。

2.string 到其它数据类型的转换函数
template< class T>
inline T from_string( const std::string & ToConvert)
{
std::stringstream streamIn( ToConvert);
T ReturnValue = T( );
streamIn >> ReturnValue;
return ReturnValue;
}

from_string函数将字符串转化为某一类型。例如,它可以将字符串转化为数据。如果输入有效,本函数将转换并返回它。另外,该函数返回指定的类型的默认值,T()为默认的构造函数。还有,它适用与任何C++内有的数据类型,对任何默认构造函数实现了“>>”操作符的类也同样适用。

注意from_string函数假定你转换的字符串中仅有一个值,任何多余的值都将被忽略。如果字符串有多值并且都是你需要的,请勿使用form_string函数,你可以从流中(直接)读取它们。

3.使用这两个转换函数:
下面的例子说明了如何使用上述的两个函数:

int n = 4;
std::string str = to_string( n); // "4"
long l = 534587;
str = to_string( l); // "534587"
n = from_string< int>( "a"); // 0
int nTest = from_string< int>( "5744"); // 5744
int nTest2 = from_string< int>( "57y4"); // 57
int nTest3 = from_string< int>( "5743 65"); // 5743; 65 igno

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/roger_77/archive/2006/03/26/639410.aspx

分享到:
评论

相关推荐

    C++ Primer第四版【中文高清扫描版】.pdf

    3.2 标准库string类型 70 3.2.1 string对象的定义和初始化 70 3.2.2 String对象的读写 71 3.2.3 string对象的操作 72 3.2.4 string对象中字符的处理 76 3.3 标准库vector类型 78 3.3.1 vector对象的定义和初始化 79 ...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参推断 607  16.2.5 模板实参推断和引用 608  16.2.6 理解std::move 610  16.2.7 转发 612  16.3 重载与模板 614  16.4 可变参数模板 618  16.4.1 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参推断 607  16.2.5 模板实参推断和引用 608  16.2.6 理解std::move 610  16.2.7 转发 612  16.3 重载与模板 614  16.4 可变参数模板 618  16.4.1 ...

    非常经典的c++ primer视频教程6-10

    3.2 标准库string类型 3.2.1 string对象的定义和初始化 3.2.2 String对象的读写 3.2.3 string对象的操作 3.2.4 string对象中字符的处理 3.3 标准库vector类型 3.3.1 vector对象的定义和初始化 3.3.2 vector...

    C++ Primer 3rd Edition 中文完美版

    间内置布尔数据类型新的强制转换方式而且还大量修改并扩展了现有的特性比如模 板template 支持面向对象object-oriented 和基于对象object-based 程序设计所需 要的类class 机制嵌套类型以及重载函数的解析机制也许...

    C++入门到精通

    第 3 章介绍了C++语言预定义的内置和复合数据类型 以及 C++标准库提供的 string complex vector 类数据类型 这些类型构成了所有程序的基石 第 4 章详细讨论了 C++语言 支持的表达式 比如算术 关系 赋值表达式 ...

    C++Primer中文版(第4版).part4

     3.2 标准库string类型  3.3 标准库vector类型  3.4 迭代器简介  3.5 标准库bitset类型  小结  术语  第4章 数组和指针  4.1 数组  4.2 指针的引入  4.3 C风格字符串  4.4 多维数组  小结  ...

    C++编程思想习题

    13.3.2在初始化表达式表中的内置类型 13.4组合和继承的联合 13.4.1构造函数和析构函数的次序 13.4.2名字隐藏 13.4.3非自动继承的函数 13.5组合与继承的选择 13.5.1子类型设置 13.5.2专门化 13.5.3私有继承 13.6保护 ...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     3.2 标准库string类型  3.3 标准库vector类型  3.4 迭代器简介  3.5 标准库bitset类型  小结  术语  第4章 数组和指针  4.1 数组  4.2 指针的引入  4.3 C风格字符串  4.4 多维数组  小结 ...

    C++Primer视频(初级)下载地址

    第3章 标准库 string 类型 (1) 20.第3章 标准库 string 类型 (2) 21.第3章重点习题解答 22.第3章标准库string类型(3) 23.第3章标准库vector类型 24.第3章重点习题解答 25.第3章迭代器简介 26.二进制和...

    C#微软培训资料

    6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术表达式.59 7.3 赋值操作符和赋值表达式.64 7.4 关系操作符和关系表达式.65 ...

    java面试题

    答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer。 list、set、map问题? 答:set 不允许...

    千方百计笔试题大全

    53、数据类型之间的转换: 14 54、字符串操作:如何实现字符串的反转及替换? 14 55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,...

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java面试宝典

    145、与之间的差别? 36 146、JSP的缺点? 36 148、如何实现JSP的国际化? 36 150、如何在JSP中包括绝对路径文件? 使用URLConnection即可。 37 151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    JAVA面试题最全集

    数据类型之间的转换 如何将数值型字符转换为数字(Integer,Double) 如何将数字转换为字符 如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何...

    c#学习笔记.txt

    字符串为 string 类型并可写成两种形式,即用引号引起来和用 @ 引起来。用引号引起来的字符串括在双引号 (") 内, 并且可以包含包括换码序列在内的任何字符用 @ 引起来的字符串以 @ 开头,并用双引号引起来。用 @ 引...

    webui:开源项目,将Web浏览器用作UI

    基本上,该库使用最新的Web服务器和WebSocket标准来维护Web浏览器(UI)和您的应用程序之间的二进制通信。您会收到任何点击事件,当然您可以发送数据或执行JavaScript代码。我该如何使用?包括一个头文件: # ...

    java基础题 很全面

    19. 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置 22 20. 如何查看在weblogic中已经发布的EJB? 22 21. 说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 22 22. ...

Global site tag (gtag.js) - Google Analytics