C++数值–字符串间转换要领总结
当前位置:以往代写 > C/C++ 教程 >C++数值–字符串间转换要领总结
2019-06-13

C++数值–字符串间转换要领总结

C++数值–字符串间转换要领总结

副标题#e#

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();
}

个中,CharT范例可以是char或wchar_t,对应的返回范例别离是string和 wstring。NumericT范例除了可以是int, long, float等内建(build-in)数值类 外型,还可以是重载了operator << 运算符的class范例。像这样利用:    

string str=Numeric2String<char>(10);
wstring wstr=Numeric2String<wchar_t>(10.1f);

同理,我们可以实现字符串到数值的转换:

1.template <typename NumericT, typename CharT>
2.NumericT String2Numeric(const basic_string<CharT> &str)
3.{
4. basic_istringstream<CharT> iss(str);
5. NumericT result;
6. iss >> result;
7. return result;
8.}


#p#副标题#e#

为了支持C气势气魄字符串直接到数值的转换,我们可以像这样为其重载一个转换 :

1.template <typename NumericT, typename CharT>
2.NumericT String2Numeric(const CharT *str)
3.{
4. basic_istringstream<CharT> iss(str);
5. NumericT result;
6. iss >> result;
7. return result;
8.}

细心的读者大概已经发明两个String2Numeric转换代码沟通,为什么还要重 载呢?这是因为我们要借助basic_istringstream类模板,需要获得CharT范例, 如果我们这样:

1.template <typename NumericT, typename StringT>
2.NumericT String2Numeric(const StringT &str)
3.{
4. basic_istringstream<??????> iss(str);
5. ...
6.}

那怎么生成basic_istringstream工具呢?若StringT是string或wstring,可 以这样basic_istringstream<string::value_type>, 惋惜依然不支持C字 符串。

此要领的利益:转换函数少,容易记着,利用利便。

缺点:模板编程对付C++初学者来说有难度,需手工实现。

(三)、利用第三方库。

譬喻boost中的lexical_cast模板:

1.string str = lexical_cast<string>(10);
2.int i = lexical_cast<int>("20");

早期的lexical_cast实现技能大抵与(二)中的相似,借助string流、重载 及模板机制。

利用此种要领的利益:成果强大且不变,仅有独一的转换接口。

缺点:需进修研究方能利用。

(四)、利用sprintf、sscanf。

其函数原型为:

1.int sprintf(char *buffer, const char *format [,argument] ...);
2.int swprintf(wchar_t *buffer, size_t count, const wchar_t *format [, argument]...);
3.int sscanf(const char *buffer, const char *format [,argument ] ...);
4.int swscanf(const wchar_t *buffer, const wchar_t *format [,argument ] ...);

试想一下当你写出如下代码时编译器还木鸡之呆地一如既往的帮你事情的情 形吧:

1.char buf[2];
2.sprintf(buf, "%d", 1000); // ooh. Compile-Ok
3.char buf2[20];
4.sprintf(buf2, "%s", 1000); // ooh. Compile-Ok

此种要领的最大漏洞是数组缓冲区容易益处,且无范例安详查抄。强烈不推 荐读者利用。

(五)、其它未列出要领。

    关键字:

在线提交作业