C++ Boost实现数字与字符串转化详解

 更新时间:2022年11月16日 09:24:42   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

一、引言

在boost库中,有一个函数Boost.LexicalCast可以将数字和字符串进行双向转换。本文介绍这种用法的案例。

二、Boost.LexicalCast

Boost.LexicalCast 提供了一个转换运算符,boost::lexical_cast,它可以将数字从字符串转换为数字类型,例如 int 或 double ,反之亦然。 boost::lexical_cast 是 std::stoi()、std::stod() 和 std::to_string() 等函数的替代方案,这些函数已添加到 C++11 的标准库中。

2.1 示例1

使用boost::lexical_cast

#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
  std::string s = boost::lexical_cast<std::string>(123);
  std::cout << s << '\n';
  double d = boost::lexical_cast<double>(s);
  std::cout << d << '\n';
}

转换运算符 boost::lexical_cast 可以转换不同类型的数字。示例 6.1 首先将整数 123 转换为字符串,然后将字符串转换为浮点数。要使用 boost::lexical_cast,请包含头文件 boost/lexical_cast.hpp。

boost::lexical_cast 在内部使用流来执行转换。因此,只能转换具有重载运算符<< 和运算符>> 的类型。但是,可以针对某些类型优化 boost::lexical_cast 以实现更有效的转换。

2.2 示例2

boost::bad_lexical_cast当出错时

#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
  try
  {
    int i = boost::lexical_cast<int>("abc");
    std::cout << i << '\n';
  }
  catch (const boost::bad_lexical_cast &e)
  {
    std::cerr << e.what() << '\n';
  }
}

如果转换失败,则会抛出从 std::bad_cast 派生的 boost::bad_lexical_cast 类型的异常。示例 2 引发异常,因为字符串“abc”无法转换为 int 类型的数字。

三、lexical_cast与c/c++提供类似接口的比较

3.1 两者比较

标准c家族中包含此类函数,例如atoi与itoa等,它们的缺点是:

(1)各个转换都是单向的,双向转换为不同函数,各种转换函数不同,接口众多;

(2)仅支持基础数据类型的子集,如int,long,double;

(3)不能提供统一的接口,易用性差;

c++中提供了stringstream,使用它进行格式转换可读性较差,使用起点较高,只是简单的转换,stringstream太重量级。

boost提供了lexical_cast,使用统一接口形式实现任意类型之间的转换,增强了易用性。但如果需要严密控制精度的转换,仍然推荐使用stringstream;数值之间的转换,推荐使用numeric_cast。

3.2 样例

#include "iostream"
#include "boost/lexical_cast.hpp" // 需要包含的头文件
using boost::lexical_cast;
using boost::bad_lexical_cast;
using namespace std;
int main()
{
    char* p="32768";
    int i=0;
    try
    {
        i=lexical_cast<int>(p); // 将字符串转化为整数
    }
    catch(bad_lexical_cast&)    // 转换失败会抛出一个异常
    {
        i=0;
    }
    cout << i << endl;
    return i;
}

到此这篇关于C++ Boost实现数字与字符串转化详解的文章就介绍到这了,更多相关C++数字与字符串转化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python扩展C/C++库的方法(C转换为Python)

    Python扩展C/C++库的方法(C转换为Python)

    这篇文章主要介绍了Python扩展C/C++库的方法(C转换为Python),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • C语言实现经典windows游戏扫雷的示例代码

    C语言实现经典windows游戏扫雷的示例代码

    今天我们会用C语言实现一个经典的windows小游戏:扫雷。扫雷是一款单机小游戏,每次通关最高难度的关卡都会开心好一阵。现在学会了C语言,总算可以自己实现扫雷了。话不多说,咱们开始吧
    2022-10-10
  • 重构-C++实现矩阵的简单实例

    重构-C++实现矩阵的简单实例

    下面小编就为大家带来一篇重构-C++实现矩阵的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 详解C语言未初始化的局部变量是多少

    详解C语言未初始化的局部变量是多少

    这篇文章主要给大家介绍了关于C语言未初始化的局部变量是多少,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • C语言变量类型与输出控制用法实例教程

    C语言变量类型与输出控制用法实例教程

    这篇文章主要介绍了C语言变量类型与输出控制用法,是C语言程序设计中比较基础也是比较重要的用法,需要的朋友可以参考下
    2014-08-08
  • 使用C语言来画出皮卡丘的教程(附代码)

    使用C语言来画出皮卡丘的教程(附代码)

    在C语言中使用图形库画图需要引入graphics.h库,我们可以通过代码实现画出一个可爱的皮卡丘,将皮卡丘的绘制分为以下部分:耳朵、脸部、眼睛、嘴巴、手臂、腿部、尾巴,下面我们就来学习如何使用C语言编写画皮卡丘的代码
    2024-01-01
  • sigsetjmp的用法总结

    sigsetjmp的用法总结

    sigsetjmp()会保存目前堆栈环境,然后将目前的地址作一个记号,而在程序其他地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序的执行
    2013-09-09
  • C语言实现扫雷游戏及其优化

    C语言实现扫雷游戏及其优化

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏及其优化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Linux C/C++实现DNS客户端请求域名IP的示例代码

    Linux C/C++实现DNS客户端请求域名IP的示例代码

    DNS全称:Domain Name System,域名解析系统,是互联网的一项服务,本文主要介绍了C/C++如何实现DNS客户端请求域名IP,感兴趣的可以了解下
    2024-03-03
  • C++实现双向链表

    C++实现双向链表

    这篇文章主要为大家详细介绍了C++实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论