这个问题经常碰到,却并不简单。
对于用十进制表示的字符串,"stdlib.h"提供了标准函数用于转换。值得提出的是,比如 atoi(),它的转换结果是有符号整数,如果要得到无符号整数,就要用别的办法了。
#include <stdlib.h> int v = atoi("123"); long vl = atol("12345"); double vl = atof("3.1415");
对于不是10进制的数值表示,比如十六进制、八进制等,"stdlib.h" 提供了 "strto*" 系列函数。
/* * long int strtol ( const char * str, char ** endptr, int base ); * unsigned long int strtoul ( const char * str, char ** endptr, int base ); * double strtod ( const char * str, char ** endptr ); */ strtol("1010111", NULL, 2); // 二进制 strtol("12", NULL, 8); // 八进制 strtol("12", NULL, 16); // 十六进制 strtol("12xyz", NULL, 36); // 三十六进制
strtol 的进制可以是从2到36的任意一个,也可以是0。对于36进制,使用的十个数字和二十六个字母。如果指定的进制是0,则根据字符串的前缀是 "0x" 或者 "0"采用十六进制或者八进制。
strtoul 和 strtol 的用法相同,除了返回值是无符号整型数(unsigned long int)。
strtod 和 atof 的一样,除了可以通过endptr返回数值后的第一个字符。
std::stringstream ss; ss << std::hex << "0x123"; // 十六进制 0x123 ss >> v; printf("%3d %3x\n", v, v); std::stringstream ss2; ss2 << std::oct << "0123"; // 八进制 0123 ss2 >> v; printf("%3d %3x\n", v, v); std::stringstream ss3; ss3 << std::dec << "123"; // 十进制 123 ss3 >> v; printf("%3d %3x\n", v, v);
据说,lexical_cast是boost库中的一个函数。下面的代码包含实现方法和用法:
#include <sstream> template<typename T2, typename T1> inline T2 lexical_cast(const T1 &in, std::ios_base& (radix)(std::ios_base&)=std::hex) { T2 out; std::stringstream ss; ss << radix << in; ss >> out; return out; } unsigned int v = lexical_cast<unsigned int>("12345");