在C++编程中有时会遇到字符串和数字的相互转化,以前学习的时候老师喜欢将这种转化当成作业,要我们写函数实现。但是实际为了方便准确还是会优先使用STL来完成。
在 C 标准库中提供了字符串到数值类型的转化函数,但是没有提供数值到字符串的转换(不过有些系统如 Windows API中提供数值到字符串的转化)。先看看C标准库中的字符串转化函数,这些函数都包含在头文件 <cstdlib>中:
表1 C 标准库中的字符串转换函数
这些函数的用法想必都比较熟悉就不多说了,细节可以参考 C或C++ 标准库。这里主要说下借助 C++ 标准模板库中的 stringstream 来完成字符串的转换。
平时我们在用 std::cout 和 std::cin 时,感觉很直接,它能根据你的数据类型自动的执行输入输出操作,无论是字符、整型、浮点型,它都能以字符串形式输出到控制台,同样也可以从控制台读入字符串,解析成各种数值类型。上面提到的 stringstream 派生自 iostream,继承了iostream的输入输出操作,你可以把它看成std::cout 和 std::cin的内存版本,对其进行的输入输出不是与控制台交互,而是与stringstream内部的字符串交互。下面是stringstream
的继承图:
图1 C++标准I/O库继承图
接下来举两个例子,应该就都会用了:
(1)字符串 --> 数值类型
先准备好包含数值类型的字符串,然后定义 istringstream 实例,使用其输入操作将其内部的字符串解析为相应的数值类型,最后输出。
#include <iostream> #include <sstream> int main() { string str = "12 3.14"; istringstream in(str); int v1; double v2; in >> v1 >> v2; cout << "v1=" << v1 << " ,v2=" << v2 << endl; return 0; }
运行结果:
v1=12 ,v2=3.14
(2)数值类型 --> 字符串
先准备好数值类型数据,然后定义 ostringstream 实例,使用其输出操作将数值类型输出到 stringstream 内部字符缓冲区中,最后调用 ostringstream::str() 成员函数获取内部字符串。
#include <iostream> #include <sstream> int main() { int v1 = 12; float v2 = 2.14f; double v3 = 3.1415926; long long v4 = 0x0123456789ABCDEF; ostringstream out; out << v1 << " " << v2 << " " << v3 << " " << hex << uppercase << v4; cout << "str=" << out.str() << endl; return 0; }
运行结果:
str=12 2.14 3.14159 123456789ABCDEF
如果不知道输入输出方向,也可以直接使用 stringstream。