您现在的位置:首页 > 教案模板 > 正文

boost string find_boost wstring string_lua string.find

2019-09-22 00:02 网络整理 教案网

boost string find_boost wstring string_lua string.find

一、概述

最近工作又开始忙了,额外学习boost的机会也变少了很多,再加上在使用Boost时出现了很多编译错误的问题,让写文章的过程变得不可预测了。但我还是很期待这一部分,这是在平时应用中最常见的,也是boost的看家本领了,将会着重介绍。在标准 C++ 中,用于处理字符串的是std::string 类,它提供很多字符串操作,包括查找指定字符或子串的函数。尽管 std::string囊括了百余函数,是标准C++中最为臃肿的类之一,但却仍不能满足很多开发者在日常工作中的需要。例如, Java中提供的可以将字符串转换到大写字母的函数,std::string就没有相应的功能。Boost C++ 库试图弥补这一缺憾。

二、区域设置

流数据(如rtp包)用一个ascii美圆符号封装,后跟一个一字节通道标识,其后是封装二进制数据 的长度,两字节整数。说明:含有带分数的加减法,方法是将整数部分和分数部分相加boost string find,再计算结果.带分数分成整数部分和分数部分时的符号与原带分数的符号相同.。scanf()函数的格式说明符如下所示:d 一十进制整数x-十六进制整数o-八进制整数u-无符号十进制数f-小数表示的浮点数e-指数表示的浮点数c-单个字符s-一字符串控制串中的一般字符表示匹配符boost string find,另外在%和格式说明符之间还可加修饰符,这些内容将在“文件和读写函数”一章中讲解(参数表)是由一个或多个参数构成,多个参数使用时用逗号分隔 c 语言常用的输入函数。

在字符串处理方面,区域设置和特定文化中对字符次序以及特殊字符的描述有关。例如,字母表中是否含有变异元音字母以及其在字母表中的位置都由语言文化决定。如果一个函数用于将字符串转换为大写形式,那么其实施步骤取决于具体的区域设置。在德语中,字母'?' 显然要转换为'?',然而在其他语言中并不一定。

使用类std::string时区域设置可以忽略, 因为它的函数均不依赖于特定语言。 然而在本章中为了使用 Boost C++ 库, 区域设置的知识是必不可少的。C++标准中在 locale 文件中定义了类 std::locale 。每个 C++ 程序自动拥有一个此类的实例,即不能直接访问的全局区域设置。如果要访问它,需要使用默认构造函数构造类std::locale的对象,并使用与全局区域设置相同的属性初始化。如下:

#include // std::cout。#include // std::cout。#include // std::cout。

以上程序在iostream中输出C,这就是基本区域设置的名称,它包括了 C 语言编写的程序中默认使用的描述。这也是每个 C++ 应用的默认全局区域设置,它包括了美式文化中使用的描述。如货币符号使用美元符号,基字符为英文句号,日期中的月份用英语书写。全局区域设置可以使用类std::locale中的静态函数global()改变。

#include<locale> #include<iostream> intmain(){std::locale::global(std::locale("German"));std::localeloc;std::cout<<loc.name()<<std::endl;}

boost wstring string_lua string.find_boost string find

静态函数global接收类型为std::locale的对象作为唯一的参数,此类的另一个版本的构造函数接受类型为const char*的字符串,可以为一个特别的文化创建区域设置对象。然而,除了C区域设置相应地命名为 "C" 之外,其他区域设置的名字并没有标准化,这就依赖于接受区域设置名字的C++标准库。VS 2008的语言字符串文档指出,可以使用语言字符串 "German" 选择定义为德国文化。

上面程序的输出是German_Germany.1252。指定语言字符串为 "German" 等于选择了德国文化作为主要语言和子语言,这里选择了字符映射1252。以此类推,如果想指定与德国文化不同的子语言设置,例如瑞士语,需要使用不同的语言字符串。

#include #include #include #include #include #include std::mutex g_lockprint。//#include #include #include #include #include #include "winsock2.h"#include #include #include #pragma comment(lib, "ws2_32.lib") using namespace std。#include #include #include #include #include #include using namespace std。

现在程序会输出 German_Switzerland.1252 。

在初步理解了区域设置以及如何更改全局设置后,下面的例子说明了区域设置如何影响字符串操作。

#include<locale> #include<iostream> #include<cstring> intmain(){std::cout<<std::strcoll("?","z")<<std::endl;std::locale::global(std::locale("German"));std::cout<<std::strcoll("?","z")<<std::endl;}

本例使用了定义在文件cstring中的函数 std::strcoll() ,该函数用于按照字典顺序比较第一个字符串是否小于第二个。也就是两个字符串中哪一个在字典中靠前(郁闷了,VC中居然不让输入?,自动变成了’?’)。执行程序,得到结果为1和-1。虽然函数的参数是一样的, 却得到了不同的结果。 原因很简单,在第一次调用函数 std::strcoll() 时,使用了全局 C 区域设置; 而在第二次调用时,全局区域设置更改为德国文化。 从输出中可以看出,在这两种区域设置中,字符'?'和'z'的次序是不同的。

很多C 函数以及 C++ 流都与区域设置有关。尽管类 std::string 中的函数是与区域设置独立工作的, 但是以下各节中提到的函数并不是这样。 所以,在本章中还会多次提到区域设置的相关内容。

三、字符串算法库 Boost.StringAlgorithms

lua string.find_boost string find_boost wstring string

Boost C++字符串算法库提供了很多字符操作函数,操作的字符串类型可以为std:;string、std::wstring或任何其他模板类std::basic_string的实例。使用时需包含头文件boost/algorithm/string.hpp,这个库中很多函数都可以接受类型为std::local的对象作为附加的可选参数,若未设置会使用默认的全局区域设置。先看下这个德国区的:

#include<boost/algorithm/string.hpp> #include<locale> #include<iostream> #include<clocale> intmain(){std::setlocale(LC_ALL,"German");std::strings="BorisSch?ling";std::cout<<boost::algorithm::to_upper_copy(s)<<std::endl;std::cout<<boost::algorithm::to_upper_copy(s,std::locale("German"))<<std::endl;}

函数to_upper_copy用于转换一个字符串为大写,它返回转换后的字符串。上面代码第一次调用时使用的是默认全局区域设置, 第二次调用时则明确将区域设置为德国文化。显然后者的转换是正确的, 因为小写字母 '?' 对应的大写形式 '?' 是存在的。而在C区域设置中, ?' 是一个未知字符所以不能转换。为了能得到正确结果,必须明确传递正确的区域设置参数或者在调用 boost::algorithm::to_upper_copy() 之前改变全局区域设置。可以注意到,程序使用了定义在头文件 clocale 中的函数 std::setlocale() 为 C 函数进行区域设置, 因为 std::cout 使用 C 函数在屏幕上显示信息。 在设置了正确的区域后,才可以正确显示 '?' 和 '?' 等元音字母。另外,程序中的setlocale函数可以用std::locale::global代替,同为全局区域设置操作。

串的最大长度(getcount() - nindex)时会出错,当ncount过大,没有足够的字符删除时,此函数不执行。 //交换两个字符串的内容c + ,append ,push_back //在尾部添加字符d insert //插入字符e erase //删除字符f clear //删除全部字符g replace //替换字符h + //串联字符串i ,。查找任何一个不包含在strcharset串中的字符 (字符串结束符null除外) 在string串中首次出现的位置序号. 返回一个整数值, 指定在string中全部由characters中的字符组成的子串的长度. 如果string以一个不包含在strcharset中的字符开头, 函数将返回0值.。

#include #include #include using namespace std。#include #include #include #include #include #include #include #include #include #include #include using namespace std。#include #include #include using namespace std。

以下各个不同函数boost::algorithm::find_first()、boost::algorithm::find_last()、 boost::algorithm::find_nth()、boost::algorithm::find_head()以及boost::algorithm::find_tail()可以用于在字符串中查找子串。

上面的程序还用到了一个boost::iterator_range,这个迭代器是所有这些函数的返回类型。此类起源于Boost C++的Boost.Range库,它在迭代器的概念上定义了“范围”。因为操作符<<由boost::iterator_range类重载而来,单个搜索算法的结果可以直接写入标准输出流。以上程序将Boris作为第一个结果输出而第二个结果为空字符串。

#include<boost/algorithm/string.hpp> #include<locale> #include<iostream> #include<vector> intmain(){std::locale::global(std::locale("German"));std::vector<std::string>v;v.push_back("Boris");v.push_back("Sch?ling");std::cout<<boost::algorithm::join(v,"")<<std::endl;}

函数boost::algorithm::join()接受一个字符串的容器作为第一个参数,根据第二个参数将这些字符串连接起来。相应地这个例子会输出Boris Sch?ling。