Namespaces
Variants

std:: ctype <char>

From cppreference.net
定义于头文件 <locale>
template <>
class ctype < char > ;

这是对 std::ctype 的特化版本,封装了针对 char 类型的字符分类功能。与使用虚函数的通用 std::ctype 不同,该特化版本通过查表方式实现字符分类(通常速度更快)。

基类 std::ctype < char > 实现的字符分类等效于最小化的 "C" 区域设置。若通过非默认分类表参数构造、构造为 std:: ctype_byname < char > 或作为用户自定义派生facet时,其分类规则可被扩展或修改。所有 std::istream 格式化输入函数在输入解析过程中均需使用 std::ctype < char > 进行字符分类。

cpp/locale/ctype base cpp/locale/locale/facet std-ctype char-inheritance.svg

继承关系图

目录

嵌套类型

类型 定义
char_type char

数据成员

td> 描述
成员
std::locale::id id [静态] facet 的标识符
const std:: size_t table_size [静态] 分类表的大小,至少为 256

成员函数

构造新的 ctype < char > facet
(公开成员函数)
析构 ctype < char > facet
(受保护成员函数)
获取字符分类表
(公开成员函数)
获取 "C" 区域设置的字符分类表
(公开静态成员函数)
使用分类表对字符或字符序列进行分类
(公开成员函数)
使用分类表定位序列中符合给定分类的首个字符
(公开成员函数)
使用分类表定位序列中不符合给定分类的首个字符
(公开成员函数)
调用 do_toupper
( std::ctype<CharT> 的公开成员函数)
调用 do_tolower
( std::ctype<CharT> 的公开成员函数)
调用 do_widen
( std::ctype<CharT> 的公开成员函数)
调用 do_narrow
( std::ctype<CharT> 的公开成员函数)

受保护成员函数

[virtual]
将字符或字符序列转换为大写
( std::ctype<CharT> 的虚受保护成员函数)
[virtual]
将字符或字符序列转换为小写
( std::ctype<CharT> 的虚受保护成员函数)
[virtual]
将字符或字符序列从 char 转换为 CharT
( std::ctype<CharT> 的虚受保护成员函数)
[virtual]
将字符或字符序列从 CharT 转换为 char
( std::ctype<CharT> 的虚受保护成员函数)

继承自 std:: ctype_base

嵌套类型

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

成员常量

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

示例

以下示例演示如何修改 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++标准。

缺陷报告 适用范围 发布时行为 正确行为
LWG 695 C++98 table() classic_table() 是受保护成员函数 将其改为公开函数

参见

定义字符分类表
(类模板)
定义字符分类类别
(类)
表示系统提供的命名区域设置的 std::ctype
(类模板)