zoukankan      html  css  js  c++  java
  • C++:cctype判断字符

    ctype.hC标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节字符,也支持宽字符

    实现

    现代的C库中,字符分类函数一般不用比较测试(comparison tests)实现,而是静态查表来实现 [1] 。

    例如,创建一个由256个8位宽整数组成的数组,每个整数的每位对应字符的特定的分类性质,如属于数字、属于字母等等。如果最低位表示属于数字性质,那么可以写成如下代码:

    #define isdigit(x) (TABLE[x] & 1)
    

    早期版本的Linux使用了潜在犯错的方法,类似于:

    #define isdigit(x) ((x) >= '0' && (x) <= '9')
    

    这会产生问题,如宏参数x具有副作用—例如,如果调用isdigit(x++)或isdigit(run_some_program()),可能不是很显然,isdigit的参数将被求值两次。所以,查表的方法被广泛使用。

    函数

    单字节字符处理函数在ctype.h(C++的cctype)中声明。宽字节字符处理函数在wctype.h(C++的cwctype)中声明.

    单字节 宽字节 描述
    isalnum iswalnum 是否为字母数字
    isalpha iswalpha 是否为字母
    islower iswlower 是否为小写字母
    isupper iswupper 是否为大写字母
    isdigit iswdigit 是否为数字
    isxdigit iswxdigit 是否为16进制数字
    iscntrl iswcntrl 是否为控制字符
    isgraph iswgraph 是否为图形字符(例如,空格、控制字符都不是)
    isspace iswspace 是否为空格字符(包括制表符、回车符、换行符等)
    isblank iswblank 是否为空白字符(C99/C++11新增)(包括水平制表符)
    isprint iswprint 是否为可打印字符
    ispunct iswpunct 是否为标点
    tolower towlower 转换为小写
    toupper towupper 转换为大写
    不适用 iswctype 检查一个wchar_t是否是属于指定的分类
    不适用 towctrans 使用指定的变换映射来转换一个wchar_t(实际上是大小写的转换)
    不适用 wctype 返回一个宽字符的类别,用于iswctype函数
    不适用 wctrans 返回一个变换映射,用于towctrans

    字符类

    序号 字符类 & 描述
    1 数字   完整的数字集合 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
    2 十六进制数字   集合 { 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f }
    3 小写字母   集合 { a b c d e f g h i j k l m n o p q r s t u v w x y z }
    4 大写字母   集合 {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }
    5 字母   小写字母和大写字母的集合
    6 字母数字字符   数字、小写字母和大写字母的集合
    7 标点符号字符   集合 ! " # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~
    8 图形字符   字母数字字符和标点符号字符的集合
    9 空格字符   制表符、换行符、垂直制表符、换页符、回车符、空格符的集合。
    10 控制字符   在 ASCII 编码中,这些字符的八进制代码是从 000 到 037,以及 177(DEL)。
    11 空白字符   包括空格符和制表符。
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cctype>
    using namespace std;
    int readn()
    {
    	char c;
    	bool f=0;
    	int n=0;
    	c=getchar();
    	while(!isdigit(c))
    	{
    		if(c=='-')f=1;
    		c=getchar();
    	}
    	do
    	{
    		n=n*10+(c-'0');
    		c=getchar();
    	}while(isdigit(c));
    	if(f)return -n;
    	else return n;
    }
    string readstr()
    {
    	char c;
    	int k=0;
    	char z[200];
    	c=getchar();
    	while(!isalpha(c)&&!isdigit(c))
    	{
    		c=getchar();
    	}
    	do
    	{
    		z[k]=c;k++;
    		c=getchar();
    	}while(isalpha(c)||isdigit(c));
    	z[k]='';
    	return z;
    }
    int main()
    {
    	string c;
    	c=readstr();
    	cout<<c<<endl;
    	return 0;
    }
    
  • 相关阅读:
    OCP-1Z0-053-V13.02-131题
    OCP-1Z0-053-V13.02-130题
    OCP-1Z0-053-V13.02-127题
    OCP-1Z0-053-V13.02-126题
    OCP-1Z0-053-V13.02-125题
    Oracle 11g New 带调度程序的轻量作业
    Oracle 11g New 资源管理器:新增的EM 界面
    Oracle 11g New 自动维护任务以及I/O校准
    tinyxml解析内存中的字符串缓冲区
    win32--tinyxml中对XML文件中的转义字符的处理
  • 原文地址:https://www.cnblogs.com/coding365/p/12872169.html
Copyright © 2011-2022 走看看