std::stoll最常用是因为它专为long long设计,自动处理前导空格、正负号和进制推断,比atoll安全、比手写快,异常语义清晰:非法输入抛std::invalid_argument,溢出抛std::out_of_range。

std::stoll 为什么最常用
直接用 std::stoll 是 C++11 及以后最稳妥的选择,它专为 long long 设计,能自动处理前导空格、正负号和进制推断(默认十进制)。比 atoll 安全,比手写循环快,且异常语义清晰。
常见错误现象:std::stoll("9223372036854775807") 正常,但 std::stoll("9223372036854775808") 会抛 std::out_of_range;而 std::stoll("") 或 std::stoll("abc") 抛 std::invalid_argument。
- 必须包含
<string></string> - 输入含非法字符(如字母混在数字中间)→
std::invalid_argument - 数值超出
long long范围(±2⁶³−1)→std::out_of_range - 支持可选的
base参数,例如std::stoll("ff", nullptr, 16)→255
如何安全捕获转换失败
生产代码里不能让异常未捕获导致崩溃。std::stoll 的异常机制虽好,但有时你只想知道“转不转得成”,不希望中断流程。
推荐写法是封装一层带状态返回的函数,避免全局异常开销:
long long safe_stoll(const std::string& s, bool* ok = nullptr) {
try {
size_t pos = 0;
long long val = std::stoll(s, &pos, 10);
if (ok) *ok = (pos == s.length()) && !s.empty();
return val;
} catch (const std::exception&) {
if (ok) *ok = false;
return 0;
}
}
注意:仅检查异常不够,还要验证是否全部字符都被解析(pos == s.length()),否则 "123abc" 会返回 123 而不报错。
atoi/atoll/stoll 性能与兼容性差异
atoll 快但不安全:不检查溢出、不报告错误位置、遇到非法字符就停在开头,返回 0 —— 无法区分 "0" 和 "abc"。
std::stoll 稍慢(异常机制有开销),但行为确定、可移植;atoi 只返回 int,绝对不能用于 long long。
- C++98 项目?只能用
atoll+ 手动边界校验(不推荐) - 嵌入式或性能敏感场景?可考虑
std::from_chars(C++17),无异常、零分配、支持部分解析 -
std::from_chars示例:long long v; auto [ptr, ec] = std::from_chars(s.data(), s.data() + s.size(), v);,ec == std::errc::invalid_argument表示格式错,ec == std::errc::result_out_of_range表示溢出
Windows 下的特殊问题:_strtoi64
MSVC 在旧项目中可能见到 _strtoi64,它是 Windows 特有、非标准函数,行为类似 std::stoll 但不跨平台。现代代码应避免使用。
容易踩的坑:_strtoi64("0x10", nullptr, 0) 不识别 0x 前缀(需显式传 16),而 std::stoll 默认支持。
如果你必须维护老代码,注意它的第三个参数是进制,不是输出指针;错误时返回 LLONG_MAX 或 LLONG_MIN,而非抛异常。
真正麻烦的是混合编译环境:某些 MinGW 版本不提供 _strtoi64,但又没完全实现 std::stoll 的 locale 支持 —— 这时优先降级用 std::from_chars(若可用)或严格校验 atoll 的输入范围。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











