您的位置:首页 >C++字符串转int方法及技巧
发布于2026-02-23 阅读(0)
扫一扫,手机访问
std::stoi 直接调用易因非法输入抛异常导致崩溃,空串、纯空白、非数字前缀触发 std::invalid_argument,超范围触发出 std::out_of_range;std::from_chars 更安全高效但需手动检查完整转换。

直接调用 std::stoi 是最常用的方式,但它在输入非法时会抛出 std::invalid_argument 或 std::out_of_range 异常,不加捕获会导致程序终止。
" ")、非数字前缀(如 "abc123")都会触发 std::invalid_argumentint 表示范围(如 "2147483648")会触发 std::out_of_rangestd::stoi("123abc") 返回 123,不报错size_t pos;
int val = std::stoi(s, &pos);
if (pos != s.length()) { /* 转换未覆盖全串 */ }std::from_chars 是无异常、零分配、高性能的底层方案,适合对稳定性或性能敏感的场景(如高频解析、嵌入式、游戏逻辑)。
+/- 以外的符号,也不支持进制自动推断(必须显式传 10)std::from_chars_result,其中 ec 成员为 std::errc::invalid_argument 或 std::errc::result_out_of_range,可直接判断std::from_chars("123abc", ...) 的 ptr 指向 'a',需自行比对终点int val;
auto [ptr, ec] = std::from_chars(s.data(), s.data() + s.size(), val, 10);
if (ec == std::errc{} && ptr == s.data() + s.size()) { /* 全串合法且完全转换 */ }std::to_string 简单直接,但不支持格式控制(如补零、进制、科学计数);std::stringstream 灵活但有构造/析构开销;fmt::format(第三方)兼顾性能与表达力。
std::to_string(42) → "42",但 std::to_string(0) 就是 "0",无法输出 "0042"std::stringstream 可用 std::setfill 和 std::setw 补零:std::stringstream ss; ss << std::setfill('0') << std::setw(4) << 42; // "0042"std::format 尚未被所有编译器默认启用;若可用,std::format("{:04}", 42) 更简洁std::to_string 对负数也正常工作,但结果含负号,长度不可控Windows 上常见 std::wstring(UTF-16),而 std::stoi 等只接受 std::string(窄字符)。别直接强转指针,会乱码或崩溃。
std::stoi((char*)wstr.c_str()) —— 宽字符指针当窄字符用是未定义行为std::wstring_convert> (已弃用)或更现代的 std::from_chars 配合 std::wstring to std::string 编码转换(如 UTF-8)std::string,但若涉及文件名或系统 API 返回宽字符串,仍需小心QString 或 CFString,优先用其原生方法(如 QString::toInt()),避免中间编码转换损耗实际转换逻辑里,最易被忽略的是“是否要求整串匹配”和“是否接受前导空白”——这两个语义差异直接决定该选 std::stoi 还是 std::from_chars,而不是看哪个函数名更短。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9