String and Text Processing(字符串和文本处理)

来源:互联网 发布:软媒win10优化工具 编辑:程序博客网 时间:2024/05/18 02:51

一、概述

   有时一个值要转换成为文本格式,如int代表 std::string,或者相反,一个std::string代表一个int数值。这样的转换是很普通的,如在内部程序运行中的数据和配置文件中的数据。

   标准C和C++库提供了大量机制进行转换,它们在易用性,扩展性和安全性方面各有不同.

   例如:C的函数 atoi(),atof()(在stdlib.h下)等有大量限制:

  • 仅在一个方向进行转换:从文本转为内部数据类型,要进行相反的转换要对易用性和安全性做一个妥协,如sprintf()等,或者损失可移值性如 itoa()。
  • 所支持的数据类型仅是内置数据类型的一个子集,如 int,long和 double。
  • 所支持的类型不能以一种统一的形式进行扩展。如将字符串转为复数或实数。

   标准C函数strtol()有相同的限制,但是提供好优雅的转换控制,然而这样的控制在很多时侯不需要或者没有用。scanf()函数家族提供了更好的控制,但缺乏安全性和易用性。

  标准C++提供了stringstream类,它提供了大量用于任意类型文件的控制和转换,然而对于简单的的转换,stringstream显得太笨拙和难以理解。

  lexical_cast()函数模板提供了一种可以将文本转换为任意其它类型一种简便、统一的方式,它的简便是表达式层面的简便。而更复杂、更精确的转换则推荐用stringstream完成。数字与数字之间的转换,boost::numeric_cast()则比lexical_cast更方便。

  对于字符串格式化,包括stringstream,lexical_cast等比较可以参看  http://www.gotw.ca/publications/mill19.htm,它上面提供的示例是很有帮助的。


二、Examples

#include "stdafx.h"
#include <boost/lexical_cast.hpp>
#include <boost/foreach.hpp>

#include <iostream>
#include <vector>

using namespace std;

void log_message(const std::string&);
void log_errno(int yoko)
{
 //log_message("Error" + boost::lexical_cast<std::string>(yoko)+":" + strerror((yoko)));
}

int main(int argc, char* argv[])

 for (int i = 0; i < argc; i++)
 {
  cout << argv[i] << endl;
 }

 using boost::lexical_cast;
 using boost::bad_lexical_cast;
 vector<short>args;

 while (*++argv)
 {
  try
  {
   args.push_back(lexical_cast<short>(*argv));
  }
  catch (bad_lexical_cast&)
  {
   args.push_back(0);
  }
 }
 for (short s : args)
 {
  cout << s << endl;
 }
 

 return 0;
}



0 0