std::ctype<char>

来自cppreference.com
< cpp‎ | locale
定义于头文件 <locale>
template<>
class ctype<char>;

std::ctype 的特化为类型 char 封装字符分类特性。不同于使用虚函数的通用 std::ctype ,此特化用表查找分类字符(通常会更快)。

基类 std::ctype<char> 实现等价于最小 "C" 本地环境的字符分类。若用非默认的分类表参数,构造为 std::ctype_byname<char> 或用户定义的导出平面,则能扩展或修改分类规则。所有 std::istream 的有格式输入函数都要求在输入分析中将 std::ctype<char> 用于字符分类。

cpp/locale/ctype basecpp/locale/locale/facetstd-ctype char-inheritance.svg

继承图

成员类型

成员类型 定义
char_type char

成员函数

构造新的 std::ctype<char> 平面
(公开成员函数)
析构 std::ctype<char> 平面
(受保护成员函数)
获得字符分类表
(公开成员函数)
获得 "C" 本地环境字符分类表
(公开静态成员函数)
用分类表分类字符或字符序列
(公开成员函数)
用分类表定位序列中首个符合给定分类的字符
(公开成员函数)
用分类表定位序列中首个不符合给定分类的字符
(公开成员函数)
调用 do_toupper
(std::ctype<CharT> 的公开成员函数)
调用 do_tolower
(std::ctype<CharT> 的公开成员函数)
调用 do_widen
(std::ctype<CharT> 的公开成员函数)
调用 do_narrow
(std::ctype<CharT> 的公开成员函数)

受保护成员函数

转换一个或多个字符为大写
(std::ctype<CharT> 的虚受保护成员函数)
转换一个或多个字符为小写
(std::ctype<CharT> 的虚受保护成员函数)
将一或多个字符从 char 转换为 charT
(std::ctype<CharT> 的虚受保护成员函数)
将一个或多个字符从 charT 转换为 char
(std::ctype<CharT> 的虚受保护成员函数)

成员对象

static std::locale::id id
[静态]
locale 的 id
(公开静态成员常量)
static const std::size_t table_size
[静态]
分类表的大小,至少 256
(公开静态成员常量)

继承自 std::ctype_base

成员类型

类型 定义
mask 未指定的位掩码类型(枚举、整数类型或 bitset )

成员常量

space
[静态]
鉴别空白字符分类的 mask
(公开静态成员常量)
print
[静态]
鉴别可打印字符分类的 mask
(公开静态成员常量)
cntrl
[静态]
鉴别控制字符分类的 mask
(公开静态成员常量)
upper
[静态]
鉴别大写字符分类的 mask
(公开静态成员常量)
lower
[静态]
鉴别小写字符分类的 mask
(公开静态成员常量)
alpha
[静态]
鉴别字母字符分类的 mask
(公开静态成员常量)
digit
[静态]
鉴别数字字符分类的 mask
(公开静态成员常量)
punct
[静态]
鉴别标点字符分类的 mask
(公开静态成员常量)
xdigit
[静态]
鉴别十六进制数字字符分类的 mask
(公开静态成员常量)
blank
[静态] (C++11)
鉴别空格字符分类的 mask
(公开静态成员常量)
alnum
[静态]
alpha | digit
(公开静态成员常量)
graph
[静态]
alnum | punct
(公开静态成员常量)

示例

下列示例演示修改 ctype<char> 以记号化逗号分隔值

#include <iostream>
#include <vector>
#include <locale>
#include <sstream>
 
// 此 ctype 平面分类逗号和换行符为空白符
struct csv_whitespace : std::ctype<char> {
    static const mask* make_table()
    {
        // 复制 "C" 本地环境表
        static std::vector<mask> v(classic_table(), classic_table() + table_size);
        v[','] |=  space;  // 逗号将被分类为空白符
        v[' '] &= ~space;      // 空格将不被分类为空白符
        return &v[0];
    }
    csv_whitespace(std::size_t refs = 0) : ctype(make_table(), false, refs) {}
};
 
int main()
{
    std::string in = "Column 1,Column 2,Column 3\n123,456,789";
    std::string token;
 
    std::cout << "default locale:\n";
    std::istringstream s1(in);
    while(s1 >> token)
            std::cout << "  " << token << '\n';
 
    std::cout << "locale with modified ctype:\n";
    std::istringstream s2(in);
    s2.imbue(std::locale(s2.getloc(), new csv_whitespace));
    while(s2 >> token)
            std::cout << "  " << token<< '\n';
}

输出:

default locale:
  Column
  1,Column
  2,Column
  3
  123,456,789
locale with modified ctype:
  Column 1
  Column 2
  Column 3
  123
  456
  789

参阅

定义字符分类表
(类模板)
定义字符分类类别
(类模板)
为具名本地环境创建 ctype 平面
(类模板)