stoi 会抛异常而 atoi 只返回 0:stoi 遇非法输入抛 std::invalid_argument 或 std::out_of_range,atoi 静默返 0;stoi 支持进制、解析位置记录,atoi 仅十进制且跳过空格;空串或纯空格时 stoi 直接抛异常,atoi 均返 0。

stoi 会抛异常,atoi 只返回 0
这是最根本的差异:遇到非法输入时,stoi 直接抛 std::invalid_argument 或 std::out_of_range,而 atoi 安静地返回 0 —— 你根本不知道是“真转出 0”,还是“压根没转成功”。
- 用
stoi时必须加try/catch,否则程序可能崩溃 -
atoi常见于 C 风格老代码,或你明确知道输入绝对合法(比如配置文件里写死的数字) - 如果字符串是
"0"、" 0 "、"0abc",atoi全部返回0;stoi对前两者成功,对第三种抛std::invalid_argument
stoi 支持进制,atoi 固定十进制
stoi 第二个参数可传指针记录解析位置,第三个参数指定进制(2–36),atoi 没这功能,只认十进制且跳过开头空格。
- 要解析十六进制字符串
"0xFF",得写stoi("0xFF", nullptr, 16),不能靠atoi - 想跳过前导空格后还知道停在哪?用
stoi(s, &idx, 10),idx会指向第一个未转换字符 -
atoi对"0x1A"返回0,它不识别0x前缀;stoi默认也不识别,必须显式传16
空字符串和纯空白字符串行为不同
atoi("") 和 atoi(" ") 都返回 0;stoi("") 直接抛 std::invalid_argument,stoi(" ") 同样抛异常(因跳过空格后无有效数字)。
- 别假设
stoi会像atoi那样“宽容”——它对空/纯空格输入零容忍 - 安全做法:调用前先用
s.find_first_not_of(" \t\n\r") != std::string::npos判断是否含有效字符 - 或者用
std::from_chars(C++17),它不抛异常、能精确报告解析终点和错误类型,但略麻烦
性能差异小,但异常开销真实存在
纯数字字符串下,两者性能几乎一样;但一旦触发异常(比如错字多的输入),stoi 的栈展开成本远高于 atoi 的简单返回。
立即学习“C++免费学习笔记(深入)”;
- 高频解析且输入不可控(如日志行、用户输入)时,
atoi+ 手动校验更稳 - 若已用
try/catch包裹且异常罕见,stoi的语义清晰性值得这点开销 - 注意:
atoi输入nullptr是未定义行为,stoi对空std::string明确抛异常










