You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C++ stoi、stoul转换十六进制字符串为整数结果错误,求解决方案

解决十六进制字符串转unsigned long int的问题

问题根源:std::stoul默认以十进制解析字符串,遇到非十进制字符'x'时停止转换,仅解析了开头的'0',因此得到结果0。

以下是两种可行的解决方法:

方法一:指定std::stoul的基数参数

给std::stoul传入第三个参数16(表示十六进制),函数会自动识别字符串中的0x前缀并正确解析:

#include <iostream>
#include <string>

int main()
{    
   std::string str = "0x12234";
   // 第三个参数指定基数为16,支持带0x前缀的十六进制字符串
   unsigned long int var = std::stoul(str, nullptr, 16);
   
   // 输出十进制结果
   std::cout << "var (decimal) = " << var << std::endl;
   // 输出十六进制格式结果
   std::cout << "var (hex) = 0x" << std::hex << var << std::endl;
   return 0;
}

如果不确定字符串的进制前缀,也可以将基数设为0,函数会自动根据前缀判断进制(0x开头为十六进制,0开头为八进制,无特殊前缀为十进制)。

方法二:使用C标准库的strtoul函数

strtoul是C标准库的转换函数,同样支持指定基数,还能通过输出参数检查转换是否有效:

#include <iostream>
#include <string>
#include <cstdlib>

int main()
{    
   std::string str = "0x12234";
   char* end_ptr;
   unsigned long int var = strtoul(str.c_str(), &end_ptr, 16);
   
   // 检查转换是否成功:若end_ptr等于原字符串首地址,说明无有效转换
   if (end_ptr == str.c_str()) {
       std::cerr << "转换失败:未找到有效数值" << std::endl;
   } else {
       std::cout << "var = " << var << std::endl;
   }
   return 0;
}

内容的提问来源于stack exchange,提问作者THESIGSEGV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:40:57