Namespaces
Variants

std:: ctype

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

ctype 封装了字符分类功能。所有通过 std:: basic_istream < CharT > 执行的流输入操作都使用流所植入区域设置的 std::ctype<CharT> 来识别空白字符以实现输入分词。流输出操作会在输出前对窄字符参数应用 std::ctype<CharT>::widen() 方法。

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

继承关系图

目录

特化

标准库保证提供以下特化(它们 是任何locale对象都必须实现的 ):

定义于头文件 <locale>
std::ctype<char> 提供最小“C”本地环境分类的窄字符等价版本。此特化使用查表法进行字符分类
std :: ctype < wchar_t > 提供适用于本地字符集的宽字符分类

嵌套类型

类型 定义
char_type CharT

数据成员

成员 描述
std::locale::id id [静态] facet 的标识符

成员函数

构造新的 ctype facet
(公开成员函数)
析构 ctype facet
(受保护成员函数)
调用 do_is
(公开成员函数)
调用 do_scan_is
(公开成员函数)
调用 do_scan_not
(公开成员函数)
调用 do_toupper
(公开成员函数)
调用 do_tolower
(公开成员函数)
调用 do_widen
(公开成员函数)
调用 do_narrow
(公开成员函数)

受保护成员函数

[virtual]
对字符或字符序列进行分类
(虚函数保护成员函数)
[virtual]
定位序列中符合给定分类的首个字符
(虚函数保护成员函数)
[virtual]
定位序列中不符合给定分类的首个字符
(虚函数保护成员函数)
[virtual]
将字符或字符序列转换为大写
(虚函数保护成员函数)
[virtual]
将字符或字符序列转换为小写
(虚函数保护成员函数)
[virtual]
将字符或字符序列从 char 转换为 CharT
(虚函数保护成员函数)
[virtual]
将字符或字符序列从 CharT 转换为 char
(虚函数保护成员函数)

继承自 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> 之外的 ctype 来对 CSV 文件进行分词:

#include <iostream>
#include <locale>
#include <sstream>
struct csv_whitespace : std::ctype<wchar_t>
{
    bool do_is(mask m, char_type c) const
    {
        if ((m & space) && c == L' ')
            return false; // 空格将不被归类为空白符
        if ((m & space) && c == L',')
            return true; // 逗号将被归类为空白符
        return ctype::do_is(m, c); // 其余情况交由基类处理
    }
};
int main()
{
    std::wstring in = L"Column 1,Column 2,Column 3\n123,456,789";
    std::wstring token;
    std::wcout << "default locale:\n";
    std::wistringstream s1(in);
    while (s1 >> token)
        std::wcout << "  " << token << '\n';
    std::wcout << "locale with modified ctype:\n";
    std::wistringstream s2(in);
    csv_whitespace* my_ws = new csv_whitespace;
    s2.imbue(std::locale(s2.getloc(), my_ws));
    while (s2 >> token)
        std::wcout << "  " << 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

参见

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