首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost::lexical_cast可以将字符串内的十六进制转换为int吗?

boost::lexical_cast可以将字符串内的十六进制转换为int吗?
EN

Stack Overflow用户
提问于 2022-11-03 11:31:56
回答 2查看 53关注 0票数 3

我在本主题C++将十六进制字符串转换为有符号整数中看到,boost::lexical_cast可以将字符串内的十六进制转换为另一种类型(int,long.)

但当我尝试这段代码时:

代码语言:javascript
运行
复制
std::string s = "0x3e8";

try {
    auto i = boost::lexical_cast<int>(s);
    std::cout << i << std::endl;        // 1000
}
catch (boost::bad_lexical_cast& e) {
    // bad input - handle exception
    std::cout << "bad" << std::endl;
}

它以一个糟糕的词汇转换异常结束!

boost不支持从字符串十六进制到int的这种类型的转换?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-03 12:44:38

根据C++将十六进制字符串转换为有符号整数的回答

似乎是因为lexical_cast<>被定义为具有流转换语义。不幸的是,流不懂"0x“符号。所以,boost::lexical_cast和我的手都滚了,一个不能很好地处理十六进制字符串。

此外,根据boost::lexical_cast<>文档

lexical_cast函数模板提供了一种方便和一致的形式,用于支持以文本形式表示的与任意类型之间的通用转换。它所提供的简化是在表达级的方便,这样的转换。对于更多涉及到的转换,例如需要更严格控制精度或格式的地方,lexical_cast**std::stringstream 的默认行为推荐使用传统的**方法。

因此,对于更多涉及的转换,建议使用std::stringstream

如果您可以访问C++11编译器,则可以使用std::stoi将任何十六进制sting转换为整数值。

stoi原型是:

代码语言:javascript
运行
复制
int stoi( const std::string& str, std::size_t* pos = nullptr, int base = 10 );

您的程序可以转换为

代码语言:javascript
运行
复制
int main() {
    std::string s = "3e8";
    auto i = std::stoi(s, nullptr, 16);
    std::cout << i << '\n';
}

输出将是

代码语言:javascript
运行
复制
1000
票数 1
EN

Stack Overflow用户

发布于 2022-11-03 15:35:19

您想要的东西存在于升压转换

Boost.Convert建立在boost::lexical_cast经验的基础上,并进一步采用了与类型转换/转换相关的想法。

  • 为了适用于更广泛的与转换相关的部署方案,
  • 为了提供更灵活、可配置和可扩展的类型转换框架,
  • 为了提供通用一致的行为,
  • 通过一个一致的接口统一和统一部署各种转换设备。

简单使用

例如,您可以使用流转换:

代码语言:javascript
运行
复制
boost::cnv::cstream converter;

你可以用你想要的机械手来配置它,例如:

代码语言:javascript
运行
复制
converter(std::hex)(std::skipws);  // IO manipulators

您可以直接使用:

代码语言:javascript
运行
复制
boost::optional<int> i;
converter(s, i);
std::cout << i << std::endl; // 1000

但我建议应用预先配置的错误处理:

代码语言:javascript
运行
复制
auto f = apply<int>(std::ref(converter))
     .value_or(-1); // decorate error-handling

现在您可以简单地写:

代码语言:javascript
运行
复制
for (auto s : cases)
    std::cout << f(s) << std::endl;

现场演示

住在Coliru

代码语言:javascript
运行
复制
#include <boost/convert.hpp>
#include <boost/convert/stream.hpp>
#include <iostream>

static const std::string cases[]{
    "0x3e8", "3e8", "-7a", "-0x7a",
    "0x-7a", // error
};

int main() {
    boost::cnv::cstream converter;
    converter(std::hex)(std::skipws);                      // IO manipulators
    auto f = apply<int>(std::ref(converter)).value_or(-1); // decorate error-handling

    for (auto s : cases)
        std::cout << std::quoted(s) << " -> " << f(s) << std::endl;

    auto g = apply<int>(std::ref(converter)); // throwing
    for (auto s : cases)
        try {
            std::cout << std::quoted(s) << " -> " << g(s) << std::endl;
        } catch (std::exception const& e) {
            std::cout << e.what() << std::endl;
        }
}

打印

代码语言:javascript
运行
复制
"0x3e8" -> 1000
"3e8" -> 1000
"-7a" -> -122
"-0x7a" -> -122
"0x-7a" -> -1
"0x3e8" -> 1000
"3e8" -> 1000
"-7a" -> -122
"-0x7a" -> -122
"0x-7a" -> Attempted to access the value of an uninitialized optional object.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74302381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档