long long stoll (const string& str, size_t* idx = 0, int base = 10);
// linux 环境下应该很少能用到
long long stoll (const wstring& str, size_t* idx = 0, int base = 10);
根据指定base, 将str内容解释成 long long int
- 过滤str中的前导space
- 从第一个合法的字符(由base决定)开始,尽可能多的取出合法字符进行解释
- 将idx指向2中最后一个合法字符的下一个位置
-
str: 表示整数的一个 std::string 变量
-
idx: 如果传入的idx不空, 函数会把该指针指向 串中 已经解释为long long int的子串的后一个位置(后面例子更直观)
-
base: 指定串的解释方式(默认为10)
串可以包括
【可选】+/- (正负号)
【可选】base前缀(0 => 八进制,0x或0X => 十六进制)
【必须】十进制数字串(如果没有base前缀的话), 八进制串(0开头),十六进制串(0x或0X开头)
串中可能有
【可选】+/- (正负号)
【可选(特殊)】如果base == 16,可以有前导0x或0X
【必须】对应base的任意字符
如 base == 36, 串中合法字符为 '0'==>'9', 'a' ==> 'z'(不区分大小写)
// stoll example
#include <iostream> // std::cout
#include <string> // std::string, std::stoll
int main ()
{
std::string str = "8246821 0xffff 020";
std::string::size_type sz = 0; // alias of size_t
while (!str.empty()) {
long long ll = std::stoll (str,&sz,0);
std::cout << str.substr(0,sz) << " interpreted as " << ll << '\n';
str = str.substr(sz);
}
return 0;
}
Output:
8246821 interpreted as 8246821
0xffff interpreted as 65535
0x20 interpreted as 32
与串中字符数量线性相关
- 函数签名
long long int strtoll (const char* str, char** endptr, int base);
-
是否抛出异常:
- std::strtoll() 不抛出异常, 如果str 不是C-string, 或endptr无效,导致未定义行为
- std::stoll()
- 如果没有实施转换,抛出 invalid_argument 异常
- 转换后的值溢出long long int, 抛出 out_of_range 异常
- 如果idx 无效,导致未定义行为
-
返回值
-
std::strtoll() ,
- 转换成功,返回实际 long long 值;
-
没有实施转换,返回0LL;
-
溢出,返回LLONG_MAX or LLONG_MIN (defined in ), errno 设成 ERANGE
-
std::stoll()
只在转换并且成功的时候返回转换后的值,否则抛异常
-
-
联系
std::stoll() 底层调用 strtoll (or wcstoll) 做转换
std::stoll() 应该是对 std::strtoll() 做了一层封装