string 类型转数值
定义于头文件 |
int 、long 、long、unsigned long、unsigned long long、float、double 、long double
转换字符串为有符号整数
c++ 11起
int stoi( const std::string& str, std::size_t* pos = 0, int base = 10 );
int stoi( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
long stol( const std::string& str, std::size_t* pos = 0, int base = 10 );
long stol( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
long long stoll( const std::string& str, std::size_t* pos = 0, int base = 10 );
long long stoll( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
转译字符串 str
中的有符号整数值。
1) 调用 std::strtol(str.c_str(), &ptr, base) 或 std::wcstol(str.c_str(), &ptr, base)
2) 调用 std::strtol(str.c_str(), &ptr, base) 或 std::wcstol(str.c_str(), &ptr, base)
3) 调用 std::strtoll(str.c_str(), &ptr, base) 或 std::wcstoll(str.c_str(), &ptr, base)
舍弃所有空白符(以调用 isspace()
鉴别),直到找到首个非空白符,然后取尽可能多的字符组成底 n (其中 n=base )的整数表示,并将它们转换成一个整数值。合法的整数值由下列部分组成:
- (可选)正或负号
- (可选)指示八进制底的前缀(
0
)(仅当底为 8 或 0 时应用) - (可选)指示十六进制底的前缀(
0x
或0X
)(仅当底为 16 或 0 时应用) - 一个数字序列
底的合法集是 {0,2,3,...,36} 。合法数字集对于底 2 整数是 {0,1
},对于底3整数是 {0,1,2
} ,以此类推。对于大于 10
的底,合法数字包含字母字符,从对于底 11 整数的 Aa
到对于底36整数的 Zz
。忽略字符大小写。
当前安装的 C 本地环境可能接受另外的数字格式。
若 base 为 0 ,则自动检测数值进制:若前缀为 0
,则底为八进制,若前缀为 0x
或 0X
,则底为十六进制,否则底为十进制。
若符号是输入序列的一部分,则对从数字序列计算得来的数字值取反,如同用结果类型的一元减。
若 pos
不是空指针,则指针 ptr
——转换函数内部者——将接收 str.c_str() 中首个未转换字符的地址,将计算该字符的下标并存储之于 *pos
,该对象给出转换所处理的字符数。
参数
str | - | 要转换的字符串 |
pos | - | 存储已处理字符数的整数的地址 |
base | - | 数的底 |
返回值
对应 str
内容的整数值。
异常
- 若不能进行转换则为 std::invalid_argument
- 若转换值会落在结果类型的范围外,或若底层函数( std::strtol 或 std::strtoll )设置 errno 为 ERANGE 则为 std::out_of_range 。
调用示例
// int 类型
// str 转10进制
std::cout << "num int: " << std::dec << std::stoi(str1, &pos)
<< " , pos: " << pos << std::endl;
pos = 0;
// str 转8进制,终端显示10进制,8进制
int numi8 = std::stoi(str2, &pos, 8);
std::cout << "num int: " << std::dec << numi8
<< " , " << std::oct << numi8;
std::cout << " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转16进制,终端显示10进制,16进制
int numi16 = std::stoi(str3, &pos, 16);
std::cout << "num int: " << std::dec << numi16
<< " , " << std::hex << numi16;
std::cout << " , pos: " << std::dec << pos << std::endl;
std::cout << std::endl;
// long 类型
pos = 0;
std::cout << "num long: " << std::dec << std::stol(str1, &pos)
<< " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转8进制,终端显示10进制,8进制
long numl8 = std::stol(str2, &pos, 8);
std::cout << "num long: " << std::dec << numl8
<< " , " << std::oct << numl8;
std::cout << " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转16进制,终端显示10进制,16进制
long numl16 = std::stoi(str3, &pos, 16);
std::cout << "num long: " << std::dec << numl16
<< " , " << std::hex << numl16;
std::cout << " , pos: " << std::dec << pos << std::endl;
std::cout << std::endl;
// long long 类型
pos = 0;
std::cout << "num long long: " << std::dec << std::stoll(str1, &pos)
<< " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转8进制,终端显示10进制,8进制
long long numll8 = std::stoll(str2, &pos, 8);
std::cout << "num long long: " << std::dec << numll8
<< " , " << std::oct << numll8;
std::cout << " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转16进制,终端显示10进制,16进制
long long numll16 = std::stoll(str3, &pos, 16);
std::cout << "num long long: " << std::dec << numll16
<< " , " << std::hex << numll16;
std::cout << " , pos: " << std::dec << pos << std::endl;
std::cout << std::endl;
转换字符串为无符号整数
c++ 11 起
unsigned long stoul( const std::string& str, std::size_t* pos = 0, int base = 10 );
unsigned long stoul( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
unsigned long long stoull( const std::string& str, std::size_t* pos = 0, int base = 10 );
unsigned long long stoull( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
转译字符串 str
中的无符号整数值。
1) 调用 std::strtoul(str.c_str(), &ptr, base) 或 std::wcstoul(str.c_str(), &ptr, base)
2) 调用 std::strtoull(str.c_str(), &ptr, base) 或 std::wcstoull(str.c_str(), &ptr, base)
舍弃所有空白符(以调用 isspace()
鉴别),直到找到首个非空白符,然后取尽可能多的字符组成底 n (其中 n=base )的无符号整数表示,并将它们转换成一个整数值。合法的无符号整数值由下列部分组成:
- (可选)正或负号
- (可选)指示八进制底的前缀(
0
)(仅当底为 8 或 0 时应用) - (可选)指示十六进制底的前缀(
0x
或0X
)(仅当底为 16 或 0 时应用) - 一个数字序列
底的合法集是 {0,2,3,...,36} 。合法数字集对于底 2 整数是 {0,1
},对于底3整数是 {0,1,2
} ,以此类推。对于大于 10
的底,合法数字包含字母字符,从对于底 11 整数的 Aa
到对于底36整数的 Zz
。忽略字符大小写。
当前安装的 C 本地环境可能接受另外的数字格式。
若 base 为 0 ,则自动检测数值进制:若前缀为 0
,则底为八进制,若前缀为 0x
或 0X
,则底为十六进制,否则底为十进制。
若符号是输入序列的一部分,则对从数字序列计算得来的数字值取反,如同用结果类型的一元减,它对无符号整数应用回卷规则。
若 pos
不是空指针,则转换函数内部的 ptr
指针会接收首个 str.c_str() 中未转换字符的地址,然后该字符的下标在计算后存储于 *pos
,给出转换所处理的字符数。
参数
str | - | 要转换的字符串 |
pos | - | 存储被处理字符数的整数的地址 |
base | - | 数字基底 |
返回值
转换到指定无符号整数类型的字符串。
异常
- 若不能进行转换则抛出 std::invalid_argument
- 若转换值会落在转换类型的范围之外,或底层函数( std::strtoul 或 std::strtoull )设 errno 为 ERANGE 则抛出 std::out_of_range 。
调用示例
// unsigned long 类型
pos = 0;
std::cout << "num unsigned long: " << std::dec << std::stoul(str1, &pos)
<< " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转8进制,终端显示10进制,8进制
unsigned long numul8 = std::stoul(str2, &pos, 8);
std::cout << "num unsigned long: " << std::dec << numul8
<< " , " << std::oct << numul8;
std::cout << " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转16进制,终端显示10进制,16进制
unsigned long numul16 = std::stoul(str3, &pos, 16);
std::cout << "num unsigned long: " << std::dec << numul16
<< " , " << std::hex << numul16;
std::cout << " , pos: " << std::dec << pos << std::endl;
std::cout << std::endl;
// unsigned long long 类型
pos = 0;
std::cout << "num unsigned long long: "
<< std::dec << std::stoull(str1, &pos)
<< " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转8进制,终端显示10进制,8进制
unsigned long long numull8 = std::stoull(str2, &pos, 8);
std::cout << "num unsigned long long: " << std::dec << numull8
<< " , " << std::oct << numull8;
std::cout << " , pos: " << std::dec << pos << std::endl;
pos = 0;
// str 转16进制,终端显示10进制,16进制
unsigned long long numull16 = std::stoull(str3, &pos, 16);
std::cout << "num unsigned long long: " << std::dec << numull16
<< " , " << std::hex << numull16;
std::cout << " , pos: " << std::dec << pos << std::endl;
std::cout << std::endl;
转换字符串为浮点值
c++ 11起
float stof( const std::string& str, std::size_t* pos = 0 );
float stof( const std::wstring& str, std::size_t* pos = 0 );
double stod( const std::string& str, std::size_t* pos = 0 );
double stod( const std::wstring& str, std::size_t* pos = 0 );
long double stold( const std::string& str, std::size_t* pos = 0 );
long double stold( const std::wstring& str, std::size_t* pos = 0 );
转译 string str
中的浮点值。
1) 调用 std::strtod(str.c_str(), &ptr) 或 std::wcstod(str.c_str(), &ptr) | (C++17 前) |
1) 调用 std::strtof(str.c_str(), &ptr) 或 std::wcstof(str.c_str(), &ptr) | (C++17 起) |
2) 调用 std::strtod(str.c_str(), &ptr) 或 std::wcstod(str.c_str(), &ptr)
3) 调用 std::strtold(str.c_str(), &ptr) 或 std::wcstold(str.c_str(), &ptr)
函数会舍弃任何空白符(由 std::isspace() 确定),直至找到首个非空白符。然后它会取用尽可能多的字符,以构成合法的浮点数表示,并将它们转换成浮点值。合法的浮点值可以为下列之一:
- 十进制浮点数表达式。它由下列部分组成:
- (可选) 正或负号
- 非空的十进制数字序列,可选地包含一个小数点字符(由当前的 C 本地环境确定)(定义有效数字)
- (可选)
e
或E
,并跟随可选的正或负号,以及非空十进制数字序列(以 10 为底定义指数)
- 二进制浮点数表达式。它由下列部分组成:
- (可选) 正或负号
0x
或0X
- 非空的十六进制数字序列,选地包含一个小数点字符(由当前的 C 本地环境确定)(定义有效数字)
- (可选)
p
或P
,并跟随可选的正或负号,以及非空十进制数字序列(以 2 为底定义指数)
- 无穷大表达式。它由下列部分组成:
- (可选) 正或负号
INF
或INFINITY
,忽略大小写
- 非数(NaN)表达式。它由下列部分组成:
- (可选) 正或负号
NAN
或NAN(
char_sequence)
,忽略NAN
部分的大小写。 char_sequence 只能由数字、拉丁字母和下划线构成。结果是一个安静的 NaN 浮点值。
- 任何其他可由当前 C 本地环境接受的表达式
若 pos
不是空指针,则对于转换函数为内部的指针 ptr
将接受 str.c_str() 中首个未转换字符的地址,然后计算该字符的下标并存储之于 *pos
,给出转换处理的字符数。
参数
str | - | 要转换的 string |
pos | - | 存储已处理字符数的整数的地址 |
返回值
转换为指定浮点类型的字符串。
异常
若不能进行转换则为 std::invalid_argument 。
若转换后的值会落在结果类型的范围外,或若底层函数( strtof
、 (C++17 起)strtod
或 strtold
)设置 errno 为 ERANGE 则为 std::out_of_range 。
调用示例
string strf = "123.456";
//float 类型
pos = 0;
float numf = std::stof(strf, &pos);
std::cout << "num float: " << std::dec << numf
<< " , pos: " << std::dec << pos << std::endl;
//double 类型
pos = 0;
double numd = std::stod(strf, &pos);
std::cout << "num double: " << std::dec << numd
<< " , pos: " << std::dec << pos << std::endl;
//long double 类型
pos = 0;
long double numld = std::stold(strf, &pos);
std::cout << "num long double: " << std::dec << numld
<< " , pos: " << std::dec << pos << std::endl;