摘要:本文详细介绍c++继承c语言ctype而来的几个函数:isalnum,isalpha,isblank,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper,isxdigit,tolower,toupper。它们是对ASCII字符判断和处理常用的函数。
一、具体介绍
1、头文件:
你需要#include <ctype.h>, 但如果用上了标准库的一些字符串处理,自然也就include了ctype.h。
#include <iostream>
using namespace std;
int main()
{
char a='a';
if (isalnum(a))
cout << "isalnum" << endl;
return 0;
}
//输出:isalnum
2、isalnum
函数完整定义:int isalnum ( int c );
函数功能:判断参数“c”是否是一个十进制数字或者是一个小写,大写字母(本文中字母指的是英文26个字母)。isalnum可以理解为is it an alpha or a num。其中alpha(字母)包括小写和大写。如果是十进制数字或者字母,那么返回true,否则false。返回true的范围用正则可表示为:[0-9a-zA-Z]。
异常处理:当参数c不在ascii范围内,例如 -129,129时,函数返回false,不会引发异常。
细节注意:当你向函数传入int等数值类型时,请把它当成对应的ascii字符对待。例如:isalnum(0)返回false,而isalnum('0')才是返回true。因为ascii值0代表着ascii表的控制字符:NULL,而字符‘0’的ascii值是48。还有参数是int型,不要传入指针类型。
3、isalpha
函数完整定义:int isalpha ( int c );
函数功能:判断参数“c”是否是一个字母(alpha)。如果是字母,返回true,否则返回false。返回true的范围正则可表示为:[a-zA-Z]。
异常处理:细节注意:如isalnum函数。
4、isblank
函数完整定义:int isblank( int c );
函数功能:判断参数“c”是否是一个空格字符(' ')。如果是空格字符,返回true,否则返回false。空格字符的ascii值是32.空格字符用正则表达式为:\s
异常处理:细节注意:如isalnum函数。
5、iscntrl
函数完整定义:int iscntrl( int c );
函数功能:判断参数“c”是否是控制字符。如果是控制字符,返回true,否则返回false。控制字符是在ascii表前32个字符以及127号字符。例如127代表DEL,删除控制。再例如输出一个7号响铃控制字符,将会听到系统的响铃(cout<<'\a'<<endl;)。 再例如‘\t’代表的tab控制字符,‘\n’代表的换行字符,‘\0’代表的空NUL字符,都是比较熟悉的控制字符。
异常处理:细节注意:如isalnum函数。通常控制字符在代码里用反斜杠\转义一个数字字符或者字母字符来表示。
6、isdigit
函数完整定义:int isdigit( int c );
函数功能:判断参数“c”是否是一个十进制数字字符。如果是十进制数字字符,返回true,否则返回false。十进制数字字符用正则表达式为:[0-9]
异常处理:细节注意:如isalnum函数。
7、isgraph
函数完整定义:int isgraph( int c );
函数功能:判断参数“c”是否是一个可用图形表示的字符。如果是可用图形表示的字符,返回true,否则返回false。可图形表示指的是有一个图形来表示的字符,大家可用看得到的。例如A,0,?等,而我们前文提到的控制字符,是无图形的,例如响铃字符,我在键盘里是打不出来给大家看的。我们可以用一段代码找出所有可图形表示的字符,如下。
#include <iostream>
using namespace std;
int main()
{
int i;
char c;
for (i=0;i<=127;++i)
{
if (isgraph(i)!=0) {
c=i;
cout << c << ' ' << endl;
}
}
return 0;
}
//输出
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~
异常处理:细节注意:如isalnum函数。空格不是可图形表示的字符。
8、islower,
函数完整定义:int islower( int c );
函数功能:判断参数“c”是否是一个小写字母。如果是小写字母,返回true,否则返回false。小写字母用正则表达式为:[a-z]
异常处理:细节注意:如isalnum函数。
9、isprint
函数完整定义:int isprint( int c );
函数功能:判断参数“c”是否是一个可打印的字符。如果是可打印的字符,返回true,否则返回false。可打印字符范围是! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` 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 { | } ~加一个空格。可以理解为可图形化字符加一个空格,也可以理解为非控制字符。集合关系可以表示为:{可图形化字符集}U{空格字符集} = {可打印字符集},{控制字符集}U{可打印字符集}={ASCII字符集}。
可以发现,我们在代码文本里能输入的所有内容,都是可打印字符组成的。没人能输入一个不可打印的字符,假设就算可以输入,其他人也看不见,编译器也看不见,又有何意义?
异常处理:细节注意:如isalnum函数。
10、ispunct
函数完整定义:int ispunct ( int c );
函数功能:判断参数“c”是否是一个标点符号。如果是标点符号,返回true,否则返回false。标点符号集指的是:
! " # $ % & ' ( ) * + , - . /: ; < = > ? @[ \ ] ^ _ ` { | } ~
它是可图形化字符集去掉isalnum字符。函数名punct是单词punctuation:标点符号。
异常处理:细节注意:如isalnum函数。
11、isspace
函数完整定义:int isspace( int c );
函数功能:判断参数“c”是否是一个空格字符。如果是空格字符,返回true,否则返回false。往往我们判断一个字符是否为空字符时,也很少用这个函数,通常第一反应想到的一个条件判断 if(c == ' ') 就可解决问题了。
异常处理:细节注意:如isalnum函数。在口头上,请区别空格字符和空字符,它们的ascii值分别是32和0.
12、isupper
函数完整定义:int isupper( int c );
函数功能:判断参数“c”是否是一个大写字母。如果是大写字母,返回true,否则返回false。大写字母用正则表达式为:[A-Z]
异常处理:细节注意:如isalnum函数。
13、isxdigit
函数完整定义:int isxdigit ( int c );
函数功能:判断参数“c”是否是一个十六进制数字字符。如果是十六进制数字字符,返回true,否则返回false。十六进制数字字符用正则表达式为:[a-f0-9A-F]。通常x在代码中有代表十六进制的含义,因此函数名为isxdigit。它比十进制数字字符多了小写a到f,大写A到F。因为十六进制表示时,是不区分大小写的,a和A表示的十六进制值都是十进制的10,所以十六进制数字字符有小写的abcdef,也包含大写的ABCDEF。
异常处理:细节注意:如isalnum函数。
14、tolower
函数完整定义:int tolower( int c );
函数功能:将一个大写字符转换成小写字符。如果输入的是一个大写字符,那么返回这个大写字符对应的小写字符。
异常处理:细节注意:如isalnum函数。如果输入的字符,不是一个大写字符,或者没有小写字符存在,那么将不做任何改变。例如char c = tolower('a'); c的值依然是'a',再例如:char c = tolower('!'); c的值依然是'!'。
15、toupper
函数完整定义:int toupper ( int c );
函数功能:与tolower相反。
二、实际应用举例
功能:要求用户设置的密码必须包含小写、大写、数字、特殊字符其中的至少三种。
bool isLegalPassword(const string &passwd)
{
#define LEAST_TYPE 3
int len = passwd.length();
int count = 0;
for (int i = 0; i < len; i++)
{
if (islower(passwd.at(i)))
{
count |= 1;
}
else if (isupper(passwd.at(i)))
{
count |= 1 << 1;
}
else if (isdigit(passwd.at(i)))
{
count |= 1 << 2;
}
else if (ispunct(passwd.at(i)))
{
count |= 1 << 3;
}
}
int totall_type = 0;
while(count)
{
if (count & 1)
totall_type +=1;
count >>= 1;
}
return totall_type >= LEAST_TYPE;
}