平时在写代码时经常需要在数值(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模板类实现。
数值到字符串的转换可如下实现之:
template <typename CharT, typename NumericT>
basic_string<CharT> Numeric2String(NumericT num)
{
basic_ostringstream<CharT> oss;
oss << num;
return oss.str();
}
字符串到数值的转换可如下实现:
template <typename NumericT, typename CharT>
NumericT String2Numeric(const basic_string<CharT> &str)
{
basic_istringstream<CharT> iss(str);
NumericT result;
iss >> result;
return result;
}
为了支持C风格字符串直接到数值的转换,我们可以重载一个转换:
template <typename NumericT, typename CharT>
NumericT String2Numeric(const CharT *str)
{
basic_istringstream<CharT> iss(str);
NumericT result;
iss >> result;
return result;
}
此方法的优点:转换函数少,容易记住,使用方便。
缺点:模板编程对于C++初学者来说有难度,需手工实现。
(三)、使用第三方库(如boost中的lexical_cast)。
使用此种方法的优点:功能强大且稳定。
缺点:需要自己移植。
青年人网推荐:感兴趣的朋友可自行研究。
(四)、使用sprintf可实现数值到字符串的转换。
此种方法可惜没有相应的反转换,且数组缓冲区容易益处,青年人网强烈不推荐使用。
责任编辑:小草