博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost的字符串处理函数——format
阅读量:5153 次
发布时间:2019-06-13

本文共 2962 字,大约阅读时间需要 9 分钟。

用boost::format来格式化字符串

在字符串处理中少不了格式化字符串,C++中传统的格式化函数是C语言的sprintf,但它一个很大的问题就是不安全。因此,在stl中引入了stringstream来实现安全格式化,但是stringstream却远不如sprintf来得直观。例如,对如如下代码:

    char text[]="hello";    

    bool is_all_lower = boost::algorithm::all(text, is_lower());

    char output[128];

    sprintf(output, "<%s> %s in the lower case", text, (is_all_lower? "is": "is not"));

如果把最后两句format的函数用stringstream来写的话,可读性是远不如sprintf的。

    stringstream output;

    output << "<" << text << "> "
        << (is_all_lower)? "is": "is not")
        << " in the lower case";

boost引入了一个提供类似.net中的string.format的方式提供格式化字符串的函数,用它来格式化的话就是如下形式:

    boost::format fmt = boost::format("<%s> %s in the lower case") % text % (is_all_lower? "is": "is not");

    string output = fmt.str();

前面的例子中演示的是C风格的格式化字符串,boost.format也提供了类似.net风格的格式化字符串方式:

    boost::format fmt = boost::format("<%1%> %2% in the lower case") % text % (is_all_lower? "is": "is not");

    cout << fmt << endl;

这种方式更容易看到参数在格式化字符串中的位置,推荐这种形式。不过它的起始坐标是1而不是0,用惯了.net的string.format的朋友需要注意下。

格式化控制

格式化语法为: [ N$ ] [ flags ] [ width ] [ . precision ] type-char。也提供了C语言和.net两种风格。

    //传统c语言风格

    cout << boost::format("\n\n%s"
            "%1t
十进制 = [%d]\n"
            "%1t
格式化的十进制 = [%5d]\n"
            "%1t
格式化十进制,前补'0' = [%05d]\n"
            "%1t
十六进制 = [%x]\n"
            "%1t
八进制 = [%o]\n"
            "%1t
浮点 = [%f]\n"
            "%1t
格式化的浮点 = [%3.3f]\n"
            "%1t
科学计数 = [%e]\n"
            ) % "example :\n" % 15 % 15 % 15 % 15 % 15 % 15.01 % 15.01 % 15.01 << endl;
    //.net
的风格
    cout << boost::format("%1%"
            "%1t
十进制
= [%2$d]\n"
            "%1t
格式化的十进制 = [%2$5d]\n"
            "%1t
格式化十进制,前补'0' = [%2$05d]\n"
            "%1t
十六进制 = [%2$x]\n"
            "%1t
八进制 = [%2$o]\n"
            "%1t
浮点 = [%3$f]\n"
            "%1t
格式化的浮点 = [%3$3.3f]\n"
            "%1t
科学计数 = [%3$e]\n"
            ) % "example :\n" % 15 % 15.01 << endl;

异常处理

既然boost.format函数是用来代替sprintf的,那么自然就得有异常处理的功能,而不是像sprintf那样死给你看。boost.format的处理方法是抛异常,它在如下两种情况家会抛异常:

  1. format字符串非法
  2. format绑定非法

如下代码演示了这两种情形:

    try

    {
        boost::format("<%3");
    }
    catch(std::exception& err)
    {
        cout << err.what() << endl;
    }
    boost::format fmt = boost::format("<%3%> %2% in the lower case") % text % (is_all_lower? "is": "is not");
    try
    {
        cout << fmt << endl;
    }
    catch(std::exception& err)
    {
        cout << err.what() << endl;
    }

封装

boost.format是以一个对象,而不是函数来实现的,导致其使用和异常处理起来要麻烦不少,不过,利用c++11的可变参数模板的语法还是可以很容易把它封装成一个可变参数的函数的形式:

    string string_fromat(const char* format, …)

需要定义三个重载版本:

    template<class TFirst>

    void string_format(boost::format& fmt, TFirst&& first)
    {
        fmt % first;
    }
    template<class TFirst, class... TOther>
    void string_format(boost::format& fmt, TFirst&& first, TOther&&... other)
    {
        fmt % first;
        string_format(fmt, other...);
    }
    template<class TFirst, class... TOther>
    string string_format(const char* format, TFirst&& first, TOther&&... other)
    {
        boost::format fmt(format);
        string_format(fmt, first, other...);
        return fmt.str();
    }

现在就可以这么用了:

    auto output = string_format("<%1%> %2% in the lower case", text, (is_all_lower? "is": "is not"));

所有的异常也都会在该函数中抛出,虽然效率上相对低点,但用起来要舒服点。

PS:可变参数模板的特性在vc 2012中还不支持,不过微软已经发布了一个使得可以在vc 2012中使用该特性,应该在下个update版本或sp1中就会正式支持。gcc可以完美支持,windows下也可以通过MinGW使用该特性。

转载于:https://www.cnblogs.com/TianFang/archive/2013/02/04/2891501.html

你可能感兴趣的文章
命令ord
查看>>
Sharepoint 2013搜索服务配置总结(实战)
查看>>
博客盈利请先考虑这七点
查看>>
使用 XMLBeans 进行编程
查看>>
写接口请求类型为get或post的时,参数定义的几种方式,如何用注解(原创)--雷锋...
查看>>
【OpenJ_Bailian - 2287】Tian Ji -- The Horse Racing (贪心)
查看>>
Java网络编程--socket服务器端与客户端讲解
查看>>
List_统计输入数值的各种值
查看>>
学习笔记-KMP算法
查看>>
Timer-triggered memory-to-memory DMA transfer demonstrator
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>
64位主机64位oracle下装32位客户端ODAC(NFPACS版)
查看>>
获取国内随机IP的函数
查看>>
今天第一次写博客
查看>>
江城子·己亥年戊辰月丁丑日话凄凉
查看>>
IP V4 和 IP V6 初识
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
(转)matlab练习程序(HOG方向梯度直方图)
查看>>
『Raid 平面最近点对』
查看>>