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

c 语言 string类型转换,用标准c++实现string与各种类型之间的转换相关推荐

  1. c语言 字符转int型,C语言—类型之间的转换

    原标题:C语言-类型之间的转换 当混合不同类型的数据进行计算时,便会发生类型转换. 当不同类型的数据进行计算时,应首先将操作数转换成相同的数据类型,然后再进行计算. 类型转换有两种形式,即隐式类型转换 ...

  2. 如何将xml的String字符串转化标准格式的String字符串

    最近,媳妇要做一个String串的格式化处理,一开始采用dom4j转化为Document对象的形式,结果不起作用,后来还是采用dom4j的方式,最终输出了一个规则的XML的String字符串,下面看看 ...

  3. Date跟String类型之间的转换!

    数据库字段在hibernate映射为日期类型,但是一般在formbean中要设置成String类型(formbean通常只有两种类型数据一种为String,另一种就是类类型),所以存在转换问题! 1. ...

  4. JAVA Long String类型之间的转换

    Long 转date Date result = new Date(param*1000); Long 转String String result = new SimpleDateFormat(&qu ...

  5. mysql time类型转换_mysql8 参考手册--Date日期和Time时间类型之间的转换

    在某种程度上,您可以将值从一种时间类型转换为另一种时间类型.但是,价值可能会有所变化或信息丢失.在所有情况下,时间类型之间的转换都取决于结果类型的有效值范围.例如,尽管 DATE, DATETIME和 ...

  6. c语言long的格式字符串,时间字符串和long类型之间的转换

    2015-08-29 10:15:01 在进行时间存储时,经常会对时间字符串进行转型存储,一般都是存储为long类型,下面我先来说一下如何将时间字符串转换为long类型: 如果时间字符串只有年月日,可 ...

  7. C语言:位(bit)与字节(byte)之间的转换

    1. 取出一个字节(byte)中的每一位(bit) 代码如下: uint8_t Data = 0x52;uint8_t n[8]={0};//方法1: n[0] = (Data & 0x01) ...

  8. c 语言 uint8 转char,在C中的uint8和char之间的转换

    我有一个API来实现对EEPROM的写入操作.下面是它的声明:在C中的uint8和char之间的转换 CYBLE_API_RESULT_T CyBle_StoreAppData (uint8 * sr ...

  9. c语言unsigned char转换成unsigned short,有关c语言数据类型转换之char,unsigned char,unsigned short...

    这是一道朗讯的笔试题(我把一些相关资料汇总了一下,希望大家能进来广泛的探讨,不甚感激!) #include int main() { char  ca; unsigned char ucb; unsi ...

最新文章

  1. ASP.NET页面借助IFrame提交表单数据所遇到的问题
  2. 装了java_下载安装Java
  3. CentOS下Clonezilla通过网络自动备份还原系统
  4. mysql raiserror_RAISERROR在SQL Server数据库中的用法
  5. 写给MongoDB开发者的50条建议Tip6
  6. 一起来学习android自定义控件3——边缘凹凸的View
  7. 这可能是这次疫情最搞笑的事情,可看着看着却鼻酸了
  8. DHCP租用信息导出方案
  9. SparkStreaming手动维护Kafka Offset的几种方式
  10. JavaScript学习(七十一)—call、apply、bind学习总结
  11. python使用json_Python之json使用
  12. 好的技术不一定能给你带来财富,但是好的工具一定可以让你创造财富
  13. 【优化算法】差分进化优化杂草优化(DIWO)【含Matlab源码 1482期】
  14. Netty 如何做到单机百万并发?
  15. 读 Timothy Gowers 之 Mathematics: A Very Short Introduction
  16. exchange发信流程
  17. 用1元钱买到原价万元的电脑是什么体验?
  18. [论文笔记]CAB:CAching in Buckets CAB-ACME
  19. vue2.0 axios 登录post请求自动读取Set-Cookie设置
  20. dnf手游服务器维护时效,dnf手游延期最新公告 dnf手游延期正真原因

热门文章

  1. MYSQL delete语句不支持别名?
  2. 解决vs新建项目是模板丢失的问题
  3. Socket套接字的速率控制(linux)
  4. Html内联定义特点,HTML5
  5. Angular - angular2升级到angular8
  6. 三维重建6:绑架问题/SensorFusion/IMU+CV-小尺度SLAM
  7. 图像的连通域检测的堆栈算法
  8. 【Python爬虫学习实践】基于BeautifulSoup的网站解析及数据可视化
  9. disconf-自动注入属性变化
  10. Redis 数据结构与内存管理策略(上)