C++数值--字符串间转换方法总结
——林石 2008-09-17编程
编写代码时常常须要在数值(int, long, float, double ...)与字符串间的相互转换。C/C++中相关的转换方法主要有以下几种:
(一)、使用CRT库中的转换函数族。数组
- _itoa, _itow 及其反转换 atoi, _wtoi
- _ltoa, _ltow 及其反转换 atol, _wtol
- _ultoa, _ultow
- _ecvt, _fcvt, _gcvt 及其反转换
- _atodbl, _atoldbl,_atoflt
- ...(太多了,不想写了)
使用此方法的优势:是C标准库中函数,现成可用且可移植(部分为平台相关)。
缺点:转换函数较多,命名不统一以至难以记住,使用不方便。
(二)、借助C++98标准中的stringstream模板类实现。
数值到字符串的转换可以下实现: 安全
其中,CharT类型能够是char或wchar_t,对应的返回类型分别是string和wstring。NumericT类型除了能够是int, long, float等内建(build-in)数值类外型,还能够是重载了operator << 运算符的class类型。像这样使用:
同理,咱们能够实现字符串到数值的转换:函数
为了支持C风格字符串直接到数值的转换,咱们能够像这样为其重载一个转换:学习
细心的读者可能已经发现两个String2Numeric转换代码相同,为何还要重载呢?这是由于咱们要借助basic_istringstream类模板,须要获得CharT类型,假如咱们这样:
那怎么生成basic_istringstream对象呢?若StringT是string或wstring,能够这样basic_istringstream<string::value_type>, 惋惜依然不支持C字符串。
此方法的优势:转换函数少,容易记住,使用方便。
缺点:模板编程对于C++初学者来讲有难度,需手工实现。
(三)、使用第三方库。
例如boost中的lexical_cast模板:ui
早期的lexical_cast实现技术大体与(二)中的类似,借助string流、重载及模板机制。
使用此种方法的优势:功能强大且稳定,仅有惟一的转换接口。
缺点:需学习研究方能使用。
(四)、使用sprintf、sscanf。spa
其函数原型为:
试想一下当你写出以下代码时编译器还呆头呆脑地一如既往的帮你工做的情形吧:orm
此种方法的最大弊端是数组缓冲区容易益处,且无类型安全检查。强烈不推荐读者使用。
(五)、其它未列出方法。对象