C++数值--字符串间转换方法总结
来源:互联网 发布:微信清理数据会怎么样 编辑:程序博客网 时间:2024/05/17 00:57
C++数值--字符串间转换方法总结
编写代码时经常需要在数值(int, long, float, double ...)与字符串间的相互转换。C/C++中相关的转换方法主要有如下几种: ——林石 2008-09-17
(一)、使用CRT库中的转换函数族。
使用此方法的优点:是C标准库中函数,现成可用且可移植(部分为平台相关)。
- _itoa, _itow 及其反转换 atoi, _wtoi
- _ltoa, _ltow 及其反转换 atol, _wtol
- _ultoa, _ultow
- _ecvt, _fcvt, _gcvt 及其反转换
- _atodbl, _atoldbl,_atoflt
- ...(太多了,不想写了)
缺点:转换函数较多,命名不统一以致难以记住,使用不方便。
(二)、借助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);
- template <typename NumericT, typename CharT>
- NumericT String2Numeric(const basic_string<CharT> &str)
- {
- basic_istringstream<CharT> iss(str);
- NumericT result;
- iss >> result;
- return result;
- }
- template <typename NumericT, typename CharT>
- NumericT String2Numeric(const CharT *str)
- {
- basic_istringstream<CharT> iss(str);
- NumericT result;
- iss >> result;
- return result;
- }
细心的读者可能已经发现两个String2Numeric转换代码相同,为什么还要重载呢?这是因为我们要借助basic_istringstream类模板,需要得到CharT类型,假如我们这样:
- template <typename NumericT, typename StringT>
- NumericT String2Numeric(const StringT &str)
- {
- basic_istringstream<??????> iss(str);
- ...
- }
那怎么生成basic_istringstream对象呢?若StringT是string或wstring,可以这样basic_istringstream<string::value_type>, 可惜依然不支持C字符串。此方法的优点:转换函数少,容易记住,使用方便。
缺点:模板编程对于C++初学者来说有难度,需手工实现。
(三)、使用第三方库。
例如boost中的lexical_cast模板:
- string str = lexical_cast<string>(10);
- int i = lexical_cast<int>("20");
使用此种方法的优点:功能强大且稳定,仅有唯一的转换接口。
缺点:需学习研究方能使用。
(四)、使用sprintf、sscanf。
其函数原型为:
- int sprintf(char *buffer, const char *format [,argument] ...);
- int swprintf(wchar_t *buffer, size_t count, const wchar_t *format [, argument]...);
- int sscanf(const char *buffer, const char *format [,argument ] ...);
- int swscanf(const wchar_t *buffer, const wchar_t *format [,argument ] ...);
- char buf[2];
- sprintf(buf, "%d", 1000); // ooh. Compile-Ok
- char buf2[20];
- sprintf(buf2, "%s", 1000); // ooh. Compile-Ok
(五)、其它未列出方法。
- C++数值--字符串间转换方法总结
- 字符串数值转换问题总结
- Objective-C 字符串与数值互相转换
- Objective-C 字符串与数值互相转换
- C#:数值与字符串之间相互转换
- ECMA数值最大最小值 数值字符串转换方法
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- 字符串转换数值 ,数值转换字符串
- [C/C++]_[十六进制字符串转换数值并写入文件]
- C语言数值交换方法总结
- C++中数值--字符串间的转换
- C++中数值--字符串间的转换
- 字符串与数值间的数据转换
- C++中数值--字符串间的转换
- Qt/Embedded完全手册qt/e
- Oracle面试题集锦-技术篇
- 自动升级程序
- 《windows via C++》之windows线程同步
- Matlab on linux with SPM5
- C++数值--字符串间转换方法总结
- xDom-一个简单的Delphi框架-介绍及下载
- 三十不算什么,心态最重要!
- linux下拉式的终端程序:Tilda 安装过程。。。
- -
- 做人?做产品?
- -
- 使用luit转换终端的编码方式
- 女孩,当你说没有好男人时请看看