【C++】字符串和数值类型的相互转化(借助STL)

转自:https://blog.csdn.net/xiaohui_hubei/article/details/21243671

写在文章开头的话

读完这篇文章后,你将学到下面的知识:
(1)如何利用标准库中的 std::stringstream 来完成字符串和数值类型的相互转换
(2)如何利用 C++11 提供的字符串转换函数,将std::string类型转换为数值类型

     在C++编程中有时会遇到字符串和数字的相互转化,以前学习的时候老师喜欢将这种转化当成作业,要我们写函数实现。但是实际为了方便准确还是会优先使用STL来完成。
     在 C 标准库中提供了字符串到数值类型的转化函数,但是没有提供数值到字符串的转换(不过有些系统如 Windows API中提供数值到字符串的转化)。先看看C标准库中的字符串转化函数,这些函数都包含在头文件 <cstdlib>中:

表1  C 标准库中的字符串转换函数

这些函数的用法想必都比较熟悉就不多说了,细节可以参考 C或C++ 标准库。这里主要说下借助 C++ 标准模板库中的 std::stringstream 来完成字符串的转换, 以及 C++11新增的 std::string 转换函数。

平时我们在用 std::cout 和 std::cin 时,感觉很直接,它能根据你的数据类型自动的执行输入输出操作,无论是字符、整型、浮点型,它都能以字符串形式输出到控制台,同样也可以从控制台读入字符串,解析成各种数值类型。上面提到的 stringstream 派生自 iostream,继承了iostream的输入输出操作,你可以把它看成std::cout 和 std::cin的内存版本,对其进行的输入输出不是与控制台交互,而是与stringstream内部的字符串交互。下面是stringstream 的继承图:

图1  C++标准I/O库继承图

接下来举两个例子来说明如何使用stringstream来进行字符串和数值类型的相互转化:

(1)字符串 –> 数值类型
     先准备好包含数值类型的字符串,然后定义 istringstream 实例,使用其输入操作将其内部的字符串解析为相应的数值类型,最后输出。


     
     
  1. #include <iostream>
  2. #include <sstream>
  3. int main()
  4. {
  5. string str = "12 3.14";
  6. istringstream in(str);
  7. int v1;
  8. double v2;
  9. in >> v1 >> v2;
  10. cout << "v1=" << v1 << " ,v2=" << v2 << endl;
  11. return 0;
  12. }

运行结果:
v1=12 ,v2=3.14

(2)数值类型 –> 字符串
     先准备好数值类型数据,然后定义 ostringstream 实例,使用其输出操作将数值类型输出到 stringstream 内部字符缓冲区中,最后调用 ostringstream::str() 成员函数获取内部字符串。


    
    
  1. #include <iostream>
  2. #include <sstream>
  3. int main()
  4. {
  5. int v1 = 12;
  6. float v2 = 2.14f;
  7. double v3 = 3.1415926;
  8. long long v4 = 0x0123456789ABCDEF;
  9. ostringstream out;
  10. out << v1 << " "
  11. << v2 << " "
  12. << v3 << " "
  13. << hex << uppercase << v4;
  14. cout << "str=" << out.str() << endl;
  15. return 0;
  16. }

运行结果:
 str=12 2.14 3.14159 123456789ABCDEF

如果不知道输入输出方向,也可以直接使用 stringstream。
 
由于 stringstream 没有重载字节类型的转换,可以通过限制宽度达到转换字节的目的,例如下面:


     
     
  1. unsigned char b = 0xAB;
  2. std:: ostringstream out;
  3. out.width( 2);
  4. out << std::hex << std::uppercase << static_cast< unsigned short>(b);
先将单字节类型变量 b 转化为无符号整型,这样可以被 stringstream 输出从操作识别,同时限制输出的宽度为2位,截断为一个字节大小。
注意:out.width(int);仅对接下来的一次输出有效,之后再输出恢复默认宽度。

借助std::string 的转换函数

     C++11 中提供了 std::string 的几个字符串转换函数,可以方便的在字符串和数值类型间相互转换。


图 2  C++11 新增 std::string 转换函数
   
 这是很方便的,但是各编译器厂商支持尚不完全。 下面是测试的结果:

     
     
  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. string s1 = “1234”;
  7. string s2 = “3.14”;
  8. int v1 = std::stoi(s1);
  9. float v2 = std::stof(s2);
  10. cout << v1 << ” “ << v2 << endl;
  11. string s3 = std::to_string( static_cast< long double>(v2)) + “15926”;
  12. cout << s3 << endl;
  13. return 0;
  14. }
运行结果:
1234 3.14
3.1415926

结论:

(1)gcc 4.8.1 尚不支持上面用法。
(2)VC++2010 支持 stox 的系列用法,但 to_string 只支持 long long / unsinged long long / long double 类型的转换。
所以在使用上面转换函数先看看编译器是否支持,如不支持还是选择使用 stringstream 或者 cstdlib 中提供的 C 函数进行字符串转换。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值