islower,isalnum,isalpha,tolower,isdigit等c++对ascii字符的处理判断

摘要:本文详细介绍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;
}

 

附录:ASCII表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值