使用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
相关产品推荐
相关产品推荐

