首页 理论教育 C++STL中的类ctype简析

C++STL中的类ctype简析

时间:2023-10-25 理论教育 版权反馈
【摘要】:类ctype_base的声明形式为:其中类型mask是位掩码类型。下面逐一介绍类ctype的成员函数。掩码值用于划分字符的分类,使用STL提供的类ctype。

C++STL中的类ctype简析

类ctype_base的声明形式为:

978-7-111-51399-5-Chapter12-42.jpg

其中类型mask是位掩码类型。

1.模板类ctype

模板类ctype的声明形式为:

978-7-111-51399-5-Chapter12-43.jpg

978-7-111-51399-5-Chapter12-44.jpg

类ctype包装了C库头文件<cctype>的特性,流istream成员被要求使用ctype<>,在输入分析时用于字符的分类。在表12-2中,即ctype<char>和ctype<wchar_ t>的实例化过程中,字符分类适应本地字符集的实例过程。

下面逐一介绍类ctype的成员函数。

2.类ctype的成员函数

(1)is()

978-7-111-51399-5-Chapter12-45.jpg

函数返回值:do_is(m,c)或do_is(low,high,vec)。这两个函数用于测试“单个字符是否具有特殊的属性或对每个字符进行分类,并将该字符存储在一个数组之中”。参数m是为字符设置的掩码;参数c是需要测试属性的字符;参数low和high指定一个范围,用于判断被测试字符是否在这个范围内;参数vec指向存储字符掩码的数组的起始位置,这些掩码值描述了存储的每个字符的属性。第一个成员函数返回一个布尔量的值,如果被测试的字符具有掩码描述的属性,返回true;如果不具备掩码规定的属性,返回false。第二个成员函数返回一个指针,指向划定属性范围的最后一个字符。

掩码值用于划分字符的分类,使用STL提供的类ctype。类ctype由ctype派生而来。第一个is()函数可以接受掩码规定的表达式。该表达式的第一个字符必须满足掩码的要求,掩码值是通过逻辑位操作实现的。

(2)scan_is()

978-7-111-51399-5-Chapter12-46.jpg

函数返回值:do_scan_is(m,low,high)。scan_is()函数用于定位和掩码匹配的第一个字符。参数m、low和high的意义和is()函数相同。函数的返回值是一个指针,在指定范围内,指向和掩码匹配的第一个字符;如果该值不存在,函数返回high。

(3)scan_not()

978-7-111-51399-5-Chapter12-47.jpg

函数返回值:do_scan_not(m,low,high)。scan_not()函数的功能和scan_is()函数相反,用于定位和掩码不匹配的第一个字符。

(4)toupper()

978-7-111-51399-5-Chapter12-48.jpg

函数返回值:do_toupper(c)或do_toupper(low,high)。toupper()函数的功能是将单个字符或某个范围的字符转换成大写形式。第一个函数的参数代表需要被转换的字符;第二个函数的参数low和high用于限定需要转换字符的范围[low,high]。

第一种形式的toupper()函数返回其参数的大写形式;如果没有大写形式存在,将返回参数本身。第二种形式的toupper()函数返回一个常量指针,该指针指向被转换的字符范围内的最后一个字符。

(5)tolower()

978-7-111-51399-5-Chapter12-49.jpg

函数返回值:do_tolower(c)或do_tolower(low,high)。其中参数c是需要被转换成小写形式的字符,参数low和high用于划定需要转换成小写形式的字符范围[low,high]。第一种形式函数返回的是参数c的小写形式,如果参数c没有小写形式存在,函数返回参数c本身;第二种形式函数返回一个常量指针,该指针指向范围[low,high]内的最后一个字符。

(6)widen()

978-7-111-51399-5-Chapter12-50.jpg

函数返回值:do_widen(c)或do_widen(low,high,to)。第一种形式的函数返回本地类型字符char对应的CharType类型的字符;第二种形式的函数返回一个指向目标范围的指针,该指针类型为CharType,该类型是通过locale将本地字符类型char转换而来的。

widen()函数用于将本地字符集char类型的字符,转换为相应的CharType类型字符。CharType类型在locale类中使用。此方法是不安全的,因为其前提是调用者判断原有的值是正确的。参数c是本地字符集中的字符,该字符会被转换;参数low是一个指针,该指针指向需要被转换的字符范围的第一个字符;参数high也是一个指针,该指针指向规定范围([low,high])内的最后一个字符后面的字符。参数to是一个指针,该指针指向目标范围中CharType类型的第一个字符,该范围中存储了需要被转换的字符。

提示

CharType用于在类locale中表示字符类型。

(7)narrow()

978-7-111-51399-5-Chapter12-51.jpg

函数返回值:do_narrow(c,dfault)或do_narrow(low,high,dfault,to)。

narrow()函数用于将类locale中的CharType类型字符转换成相应的本地字符集的char类型的字符。同样,此方法也是不安全的,因为其前提是调用者判断其旧值是正确的。参数c是类locale中的CharType类型的数据,是用来被转换的;参数dfault参数默认为‘\0’,是该函数的默认值;参数low和high用于限定一个字符集的范围,该范围的字符会进行narrow转换;参数to是指向存储被转换字符的目标范围第一个字符的指针。

函数的返回值:返回本地char类型的字符,该字符是和CharType参数dfault相对应的。第二种形式的函数返回一个指向本地字符集的目标范围指针,本地字符集是CharType类型的字符转换而来的。

第一种形式的函数返回do_narrow(c,dfault);第二种形式的函数返回do_narrow(low,high,dfault,to)。仅仅基础的字符集被保证拥有独一无二的反向映像。对于最基本的源字符,表达式是成立的。

978-7-111-51399-5-Chapter12-52.jpg

提示

任何ctype类的优先于narrow()的方法同样也优先于ctype类的narrow_s方法

3.类ctype的虚函数成员

(1)do_is()

978-7-111-51399-5-Chapter12-53.jpg

上述两个函数用于分类一个字符或字符序列。对于每个参数,要识别掩码参数vec的值。第二种形式用以识别范围[low,high]中每个字符的掩码的值,并将其放入向量[p- low]中。第一种形式的函数返回值返回表达式((M&m)!=0)的结果;如果字符具备指定的特性,函数返回true,第二种形式函数返回high。此函数被调用时,其功能是判断单个字符是否具有特定的属性;或对某范围内或数组内的每个字符进行分类。

如果被测试的字符具有特定的(由mask确定)属性,函数返回true;否则,函数返回false。第二种形式的函数返回一个数组,该数组中容纳指定范围内字符的掩码特性。

(2)do_scan_is()

978-7-111-51399-5-Chapter12-54.jpg

do_scan_is()函数用于在一个缓冲区中定位一个字符,该字符满足分类(掩码)特性m。函数的返回值是范围[low,high]中满足特定掩码特性的第一个指针。若满足这一条件,is(m,p)函数会返回true,否则,返回high。如果没有相应的值存在,函数返回high。

(3)do_scan_not()

978-7-111-51399-5-Chapter12-55.jpg

do_scan_not()函数用于定位缓冲区中不满足条件的第一个字符。如果没有相应的值存在,函数返回high。保护成员函数返回范围[low,high]中最小的指针,该指针满足函数do_is()的返回值为false。

(4)do_toupper()

978-7-111-51399-5-Chapter12-56.jpg

do_toupper()函数用于转换单个字符或多个字符,以获取其大写形式。如果字符相应的大写字符存在,函数的第二种形式会取代指定范围[low,high]中的每个字符;否则,返回该字符本身。如果参数c的大写字符形式存在,第一种形式的函数会返回参数c相应的大写字符;如果参数的大写形式不存在,返回字符本身。第二种形式会返回指针high。

(5)do_tolower()

978-7-111-51399-5-Chapter12-57.jpg

上述两种形式的函数用于将单个字符或多个字符转换成小写形式。第二种形式会转换范围[low,high]中的每个字符成为其小写形式,如果该字符不存在小写形式,会返回字符本身。第一种形式的函数,如果参数c的小写形式存在,会返回相应的小写形式;如果不存在,返回参数本身。第二种形式的函数会返回参数high。

(6)do_widen()

978-7-111-51399-5-Chapter12-58.jpg

上述两种形式的函数用于将本地字符集中的char类型字符转换为相应的类locale中的CharType类型。本方法存在潜在的不安全性,它依赖于调用者判断该值是正确的。对于任何具名的ctype类刻面和有效的ctype_base::mask的值(M(is(M,c)||!ctw.is(M,do_widen(c)))为真。对于字符的第二种形式的转换,其结果保存在缓冲区dest中。函数返回值是变化后的值,第二种形式返回high。

(7)do_narrow()

978-7-111-51399-5-Chapter12-59.jpg

do_narrow()函数用于将charT类型的单个字符或多个字符转换为相应的char类型值。对于任何基本源字符集中的char类型字符c,其变换具有以下性质:

978-7-111-51399-5-Chapter12-60.jpg

对于任何具名的ctype类型,其刻面和掩码ctype_base::mask的值M之间表达式(下述)的值为真:

978-7-111-51399-5-Chapter12-61.jpg

除非do_narrow返回dfault。另外,对于任何数字式字符,表达式(do_narrow(c,dfault)-'0')评估为该字符的数字值。第二种形式转换范围[low,high]中每个字符,并将转换之后的结果放至缓冲区dest中。第一种形式返回转换之后的值,如果没有匹配的值会返回默认值dfault;第二种形式返回high。

4.举例

下面使用例12-6来说明类ctype的具体使用方法。

例12-6

978-7-111-51399-5-Chapter12-62.jpg

978-7-111-51399-5-Chapter12-63.jpg

978-7-111-51399-5-Chapter12-64.jpg

例12-6的执行结果为:

978-7-111-51399-5-Chapter12-65.jpg

978-7-111-51399-5-Chapter12-66.jpg

5.类ctype_byname

类ctype_byname的声明形式如下(注意第二行代码中的加粗字):

978-7-111-51399-5-Chapter12-67.jpg

6.类ctype的实例化类举例

类ctype的实例化(主要实例化char类型)在本小节描述。例如,

978-7-111-51399-5-Chapter12-68.jpg

一个类ctype的实例化特例使得类型char的成员函数可以被在线实施。可实施的成员ta-ble_size的值至少等于256。

(1)ctype<char>析构器

978-7-111-51399-5-Chapter12-69.jpg

如果构造器的第一个参数是非零的,并且构造器的第二个参数是“true”,析构器的作用等同于执行以下语句:

978-7-111-51399-5-Chapter12-70.jpg

(2)ctype<char>成员函数(www.xing528.com)

下面介绍ctype<char>成员函数。对于非符号字符型的值v,此处(v>=table_size),table()[v]是被假定拥有一个可实施的值(对于每个这样的值,存在可能的差异),且没有执行数组搜索

978-7-111-51399-5-Chapter12-71.jpg

前提条件:tbl或者为0,或者是table_ size的数组,该数组至少包含table_ size个元素。该成员函数的作用是传递参数refs给其基类的构造器。

978-7-111-51399-5-Chapter12-72.jpg

函数的作用:第一种形式会返回table()[(unsigned char)c]&m,第二种形式返回参数high。

978-7-111-51399-5-Chapter12-73.jpg

函数返回值是指定范围[low,high]中的最小元素,以使table()[unsignedchar p]&m的值是true。

978-7-111-51399-5-Chapter12-74.jpg

函数返回值是指定范围[low,high]中最小的值,以使table()[unsignedchar* p]&m的值为false。

978-7-111-51399-5-Chapter12-75.jpg

函数返回值是do_toupper(c)或do_tolower(low,high)。

978-7-111-51399-5-Chapter12-76.jpg

函数返回值是do_tolower(c)或do_tolower(low,high)。

978-7-111-51399-5-Chapter12-77.jpg

函数返回值是do_widen(c)或do_widen(low,high,to)。

978-7-111-51399-5-Chapter12-78.jpg

函数返回值是do_narrow(c)或do_narrow(low,high,to)。

978-7-111-51399-5-Chapter12-79.jpg

函数返回值:如果构造器的第一个参数是非零,函数返回值是该参数;否则,返回classic_table()。

(3)ctype<char>的静态成员

978-7-111-51399-5-Chapter12-80.jpg

函数返回值是数组初始元素的指针,数组的大小为tablesize,该指针代表了类locale的字符类别。

(4)ctype<char>的虚函数

978-7-111-51399-5-Chapter12-81.jpg

上述这些函数和ctype模板中与其同名的函数具有同样的功能。

7.类ctype_byname<char>

类ctypebyname<char>的声明形式如下:

978-7-111-51399-5-Chapter12-82.jpg

8.模板类codecvt

模板类codecvt的声明形式如下:

978-7-111-51399-5-Chapter12-83.jpg

978-7-111-51399-5-Chapter12-84.jpg

类codecvt<internT,externT,stateT>是用来转换代码集的。例如,从宽字符到单字节字符或者宽字符编码之间的转换(例从unicode码到EUC码的转换)。

stateT类型参数是中间类型,是两种类型在相互转换时需要的中间状态类型,需要选择成对的代码集,并且两个代码集之间互相匹配。

类的实例化通常有codecvt<wchar_t,char,mbstate_t>和codecvt<char,char,mbstate_t>,用于转换本地字符集。实例化类codecvt<char,char,misstate_t>实施一种退化的转变,它不实行根本的变换。实例化类codecvt<wchar_t,char,mbstate_t>实现在本地字符集的窄字符集和宽字符集之间进行转换。mbstate的实例化实现在两种编码之间的转换。另一种编码可以使用自定义类型stateT实现转换。stateT类型的对象可以包含任何状态,这些状态有利于在特定的do_in或do_out成员之间通信

(1)codecvt类成员

978-7-111-51399-5-Chapter12-85.jpg

函数返回值是do_out(state,from,from_end,from_next,to,to_limit,to_next)。转换内部类型CharType的序列为外部类型Byte的序列。

•参数state。该参数代表一种转换状态,是在调用成员函数之间的中间状态。

•参数from。该指针指向被转换序列的开始。

•参数from_end。该指针指向被转换序列的尾部。

•参数from_next。前一个CharType类型被转换之后,指向其后第一个没有转换的Ch- arType类型数据。

•参数to。该指针指向已转换序列的开始位置。

•参数to_limit。该指针指向已转换序列的尾部。

•参数to_next。该指针指向已转换数据之后的第一个未转换的Byte类型数据。

978-7-111-51399-5-Chapter12-86.jpg

函数返回值是do_unshift(state,to,to_limit,to_next)。在转换过程中,为了完成序列中最后一个Byte类型字符的转换,提供必需的Byte类型数据。参数state是中间过渡状态数据类型;参数to是指针,该指针指向目的范围的第一个位置;参数to_limit也是指针,该指针指向目的范围的最后一个位置;参数to_next是指针,该指针指向目的序列中第一个未转换的元素。

978-7-111-51399-5-Chapter12-87.jpg

函数返回值是do_in(state,from,from_end,from_next,to,to_limit,to_next)。函数result in()用于将一种外部类型Byte的序列转换成一种内部的CharType类型的序列。参数state是中间过渡状态;参数from是指针,指向被转换序列的开始位置;参数from_end是指针,该指针指向被转换序列的尾部;参数from_next是指针,指向已转换序列尾部之后第一个未转换字符;参数to是指针,该指针指向已转换序列的起始位置;参数to_limit是指针,该指针指向已转换序列的尾部;参数to_ next是指针,该指针指向目标序列中已转换的Ch-arType序列的第一个未被转换的字符。

978-7-111-51399-5-Chapter12-88.jpg

函数返回do_encoding()。函数的作用:如果字节流的编码方式是状态独立的,函数判断Bytes和CharType之间的转换比率是否是常量,如果是常量,决定比率参数ratio的数值。函数的返回值如果是正值,该值是Byte类型字符的常量数量,这些Byte类型字符用于产生CharType类型的字符。函数返回值通常有3种形式(见表12-8):

12-8 函数encoding的返回值

978-7-111-51399-5-Chapter12-89.jpg

978-7-111-51399-5-Chapter12-90.jpg

函数返回值是do_always_noconv()。always_noconv()函数用于判断是否没有转换需要执行。函数返回值是逻辑量,如果没有转换被执行,函数返回true;如果至少有一个转换被执行,函数返回false。

978-7-111-51399-5-Chapter12-91.jpg

函数返回值是do_length(state,from,from_end,max)。length()函数用于判断有多少Byte类型的字节数,并返回该字节的数目。参数state是调用函数时要保持的中间转换状态;参数from是指针,指向外部序列的起始位置;参数from_end是指针,指向外部序列的尾部;参数max代表函数可返回的Byte类型的最大数值。

(2)类的虚函数

978-7-111-51399-5-Chapter12-92.jpg

前提条件:(from<=from_end&&to<to_end)被预先定义,且其值为true。state是预先初始化的,它在序列的起始位置,否则等于序列中转换字符的结果。

函数的作用:转变范围[from, from_end]中的字符,将其放置于目标序列to中。转换不少于from_end-from个的元素,并将存储不少于to_limit-to个目标元素。当面对一个字符不能转换的情况时,函数将中止;函数总是保留指针from_next和to_next,指向已成功转换的最后一个元素。函数将返回Noconv,internT和externT是同一类型,并且被转换的序列和输入序列[from,fro_next)是一致的。指针to_next被设定和指针to相等,state的值是不变的,并且范围[to,to_limit]中的值是不变的。

提示

当参数state未指定时,函数才能运行。

函数返回值有以下几种选项(见表12-9):

12-9 函数do_out()和函数do_in()的返回值

978-7-111-51399-5-Chapter12-93.jpg

返回值partial说明目标序列不能吸收所有目标元素,或者另一个目标元素产生之前,附加的源元素是必需的。

978-7-111-51399-5-Chapter12-94.jpg

函数的作用:在当前状态stateT等于state时,将起始位置为to的字符放置入序列中。存储不少于(to_limit-to)个目标元素。函数总是保留to_next指针,该指针指向被存储的最后一个元素的前面。函数的返回值也是一个枚举变量,其枚举值见表12-10。

12-10 函数do_unshift()的返回值

978-7-111-51399-5-Chapter12-95.jpg

codecvt<char,char,mbstate_t>返回noconv。

978-7-111-51399-5-Chapter12-96.jpg

若externT类型序列编码是状态独立的,函数返回-1;否则,常量数目的externT字符需要产生一个内部字符;如果数目不是常量,返回0。对于所有有效参数,如果do_in()和do_out()返回noconv,函数返回值为真;codecvt<char,char,mbstate_t>返回true。

978-7-111-51399-5-Chapter12-97.jpg

前提条件:(from<=from_end)被预先定义,其值为true。state被初始化之后,序列的起始或许等于序列中被转换字符的结果。当参数state不确定时,函数调用do_in(),do_in的参数to指向包含至少max个元素的缓冲区。

若from_next是范围[from,from_end]中的最大值,则范围[from,from_next]中的值表示internT类型的最大的或第二大的有效完整字符。

978-7-111-51399-5-Chapter12-98.jpg

函数返回do_length返回的最大值,并且stateT的值为state。

实例化函数codecvt<char,char,mbstate_t>::do_max_length()会返回1。

下面使用例12-7说明类模板codecvt的使用方法。

例12-7

978-7-111-51399-5-Chapter12-99.jpg

978-7-111-51399-5-Chapter12-100.jpg

例12-7的执行结果为:

978-7-111-51399-5-Chapter12-101.jpg

9.模板类codecvt_byname

978-7-111-51399-5-Chapter12-102.jpg

978-7-111-51399-5-Chapter12-103.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈