命名空间
变体
操作

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

[编辑] 成员函数

构造一个新的 ctype<char>
(公共成员函数) [编辑]
析构一个 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
[静态]
id 的区域设置
(公共静态成员常量)
static const std::size_t table_size
[静态]
分类表的大小,至少 256
(公共静态成员常量)

std::ctype_base 继承

成员类型

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

成员常量

space
[静态]
mask 的值,用于标识空白字符分类
(公共静态成员常量)
print
[静态]
mask 的值,用于标识可打印字符分类
(公共静态成员常量)
cntrl
[静态]
mask 的值,用于标识控制字符分类
(公共静态成员常量)
upper
[静态]
mask 的值,用于标识大写字符分类
(公共静态成员常量)
lower
[静态]
mask 的值,用于标识小写字符分类
(公共静态成员常量)
alpha
[静态]
mask 的值,用于标识字母字符分类
(公共静态成员常量)
digit
[静态]
mask 的值标识数字字符分类
(公共静态成员常量)
标点符号
[静态]
mask 的值标识标点符号字符分类
(公共静态成员常量)
十六进制数字
[静态]
mask 的值标识十六进制数字字符分类
(公共静态成员常量)
空白
[静态] (C++11)
mask 的值标识空白字符分类
(公共静态成员常量)
字母数字
[静态]
字母 | 数字
(公共静态成员常量)
图形
[静态]
字母数字 | 标点符号
(公共静态成员常量)

[编辑] 示例

以下示例演示了修改 ctype<char> 以对逗号分隔的值进行标记

#include <cstddef>
#include <iostream>
#include <locale>
#include <sstream>
#include <vector>
 
// This ctype facet classifies commas and endlines as whitespace
struct csv_whitespace : std::ctype<char>
{
    static const mask* make_table()
    {
        // make a copy of the "C" locale table
        static std::vector<mask> v(classic_table(), classic_table() + table_size);
        v[','] |=  space; // comma will be classified as whitespace
        v[' '] &= ~space; // space will not be classified as whitespace
        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

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 695 C++98 table()classic_table() 是受保护的成员函数 将它们设为公有函数

[编辑] 另请参阅

定义字符分类表
(类模板) [编辑]
定义字符分类类别
(类) [编辑]
代表为指定区域设置提供的系统 std::ctype
(类模板) [编辑]