用标准c++实现string与各种类型之间的转换

 更新时间:2013年09月27日 12:14:42   作者:  
这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本

要实现这个目标,非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(); }

相关文章

  • Qt编写地图之实现经纬度坐标纠偏

    Qt编写地图之实现经纬度坐标纠偏

    地图应用中都涉及到一个问题就是坐标纠偏的问题,这个问题的是因为根据地方规则保密性要求不允许地图厂商使用标准的GPS坐标,而是要用国家定义的偏移标准。本文将详细讲解如何在Qt中实现经纬度坐标纠偏,需要的可以参考一下
    2022-03-03
  • Windows下VScode实现简单回声服务的方法

    Windows下VScode实现简单回声服务的方法

    回声服务端可以将客户端传来的信息,再原封不动地发送给客户端,因而得名 epoch 服务。接下来通过本文给大家介绍Windows下VScode实现简单回声服务的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • C++编译器Clion的使用详解(总结)

    C++编译器Clion的使用详解(总结)

    Clion有一个比较让人郁闷的地方就是必须要把编译环境配置好了,IDE才去做代码分析等动作,但是还是有很多优点,本文重点给大家介绍C++编译器Clion的使用,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • C++ 动态内存管理详情解说

    C++ 动态内存管理详情解说

    这篇文章主要介绍了C++ 动态内存管理详情解说,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下,希望对你的学习有所帮助
    2022-07-07
  • C++取得本机IP的方法

    C++取得本机IP的方法

    这篇文章主要介绍了C++取得本机IP的方法,代码简单功能实用,具有不错的借鉴参考价值,需要的朋友可以参考下
    2014-10-10
  • C语言工程文件该如何写(以三子棋游戏为例)

    C语言工程文件该如何写(以三子棋游戏为例)

    工程上写代码应分为多个文件,那么你知道C语言工程文件该如何写吗,本文就以以三子棋游戏为例,介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 详解C++中的对象指针与对象数组

    详解C++中的对象指针与对象数组

    这篇文章主要介绍了详解C++中的对象指针与对象数组,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言实现运筹学中的马氏决策算法实例

    C语言实现运筹学中的马氏决策算法实例

    这篇文章主要介绍了C语言实现运筹学中的马氏决策算法,简单介绍了马氏决策的概念,并结合实例形式分析了C语言实现马氏决策算法的具体实现技巧,需要的朋友可以参考下
    2017-09-09
  • 浅谈C++中的构造函数分类及调用规则

    浅谈C++中的构造函数分类及调用规则

    这篇文章主要介绍了C++中的构造函数分类及调用规则,文中根据参数写出了几种不同类型的构造函数并解释了如何调用,需要的朋友可以参考下
    2016-03-03
  • C/C++ Qt 基本文件读写的基本使用(2种实现)

    C/C++ Qt 基本文件读写的基本使用(2种实现)

    文件的读写是很多应用程序具有的功能,本文主要介绍了两种实现方法,第一种使用QFile类的IODevice读写功能直接读写,第二种是利用 QFile和QTextStream结合起来,用流的方式进行文件读写
    2021-11-11

最新评论