命名空间
变体
操作

std::ctype<char>

来自 cppreference.cn
< cpp‎ | locale
 
 
 
 
定义于头文件 <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 basecpp/locale/locale/facetstd-ctype char-inheritance.svg

继承关系图

内容

[编辑] 嵌套类型

类型 定义
char_type char

[编辑] 数据成员

成员 描述
std::locale::id id [static] facet 的标识符
const std::size_t table_size [static] 分类表的大小,至少为 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++ 标准。

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

[编辑] 参见

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