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]='\0';
	return z;
}
int main()
{
	string c;
	c=readstr();
	cout<<c<<endl;
	return 0;
}
posted @ 2020-05-03 10:10  Aeterna_Gungnir  阅读(505)  评论(0编辑  收藏  举报