分类函数
ASCII字符可以分为英文字母、数字、控制字符、空白字符、大小写字母以及标点符号,分类是指对字符进行属性判定,判断字符属于哪些范畴,这些属性的判定在程序中非常常见,尤其是通信协议的字符处理部分更是必不可少。
1 字母数字
本节介绍判定字符是否是字母或者数字的相关分类函数,函数所在头文件为ctype.h,参数为需要判断的字符,下面不再作特别说明。
1.1 判断字符是否为英文字母isalpha()
【函数原型】int isalpha(int c)
【功能讲解】判断字符是否是英文字母,如果字符是英文字符则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程能判断用户输入字符是不是英文字母。如果输入的是英文字母则显示出来,否则提示不是英文字母,直到输入.结束本例子
/*函数isalpha()示例*/ #include <ctype.h>/*函数isalpha()所在头文件 int main(void) { char ch; do { ch = getch();/*获取键盘输入字符*/ if(isalpha(ch))/*判定字符是不是英文字母*/ { printf("您输入的是英文字母%c ",ch); } else { printf("您输入的不是英文字母! "); } } while(ch != '.');/*遇到结束字符则结束本程序*/ return 0; }
【运行结果】
输入字符a则显示:您输入的是英文字母a
输入字符f则显示:您输入的是英文字母f
输入字符F则显示:您输入的是英文字母F
输入字符.则显示:您输入的不是英文字母!
【实例讲解】本例使用简单的do…while循环语句等待用户输入字符,当用户输入后马上调用isalpha()检测是否是英文字母,给出相应的提示信息,直到输入‘.’结束本例子。
1.2 判断字符是否为数字isdigit()
【函数原型】int isdigit(int c)
【功能讲解】判断字符是否是数字,如果字符是数字则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程判断数组中哪些字符是数字字符,不是数字的不做任何处理,如果是数字字符分行显示到屏幕。
/*函数isdigit()示例*/ #include <ctype.h> /*函数isdigit()所在的头文件*/ int main() { char str[]="123kal*(0-#"; /*任意初始化一个字符数组,包括数字*/ int i; /*使用for循环逐个检测*/ for (i=0;str[i]!=0;i++) { if(isdigit(str[i])) /*判断是否是数字*/ { printf("%c 是数字 ",str[i]); /*输出数字字符*/ } } return 0; }
【运行结果】
1 是数字
2 是数字
3 是数字
0 是数字
【实例讲解】本例首先是随意初始化一个字符数组,里面填写入数字、标点符号、英文字母等,然后是否for循环逐个调用isdigit()判断是否是数字,程序会列出数组中所有的数字字符。
1.3 判断字符是否为英文字母或数字isalnum()
【函数原型】int isalnum(int c)
【功能讲解】判断字符是否是英文字母或者数字,如果字符是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程是逐个判断字符数组中所有的字符,如果是数字或者英文字母,则显示到屏幕,如果不是,则不作任何处理。
/*函数isalnum()示例*/ #include <ctype.h> /*函数isalnum()所在的头文件*/ int main() { char str[]="123kal*(0-#10"; /*初始化一个包含数字的字符数组*/ int i; /*循环判定*/ for (i=0;str[i]!=0;i++) { if(isalnum(str[i])) /*判断是字母或者数字*/ { printf("%c ",str[i]); /*把相应的字符显示出来*/ } } printf("是英文字母或数字 "); return 0; }
【运行结果】
123kal010 是英文字母和数字
【实例讲解】本例首先是随意初始化一个字符数组,里面填写入英文字母和数字,当然也包含其他字符,然后是否for循环逐个调用isalnum()判断是否是英文字母或数字,程序会列出数组中所有的判断为真的字符,在循环结束后再显示一段说明文字,告诉用户那些就是英文字符和数字。
1.4 判断字符是否为小写字母islower()
【函数原型】int islower(int c)
【功能讲解】判断字符是否是小写字母,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程能判定用户输入的字符是否是小写字母,运行的效果是只显示用户输入的小写字母,输入其他字符不显示,按Esc结束程序。
/*函数islower()示例*/ #include<ctype.h> /*函数islower()所在头文件*/ int main(void) { char ch; /*定义字符变量*/ do//循环 { ch = getch(); /*获取键盘输入*/ if(islower(ch)) /*判断是否是小写字母*/ { printf("%c ",ch); /*显示出字符*/ } } while(ch != 27); /*遇到Esc退出本程序*/ return 0; /*函数返回*/ }
【运行结果】
输入1:无显示
输入7:无显示
输入A:无显示
输入 a: a
输入g: g
【实例讲解】例子中使用do…while循环语句检测输入的字符是不是小写字母,如果是则显示出来,不是小写字母的没做处理,就像是用户不能输入小写字母以外的字符一样。
1.5 判断字符是否为大写字母isupper()
【函数原型】int isupper(int c)
【功能讲解】判断字符是否是大写字母,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程能判定用户输入的字符是否是大写字母,运行的效果是只显示用户输入的大写字母,输入其他字符不显示,按Esc结束程序。
/*函数isupper()示例*/ #include<ctype.h> /*函数isupper()所在头文件*/ int main(void) { char ch; /*定义字符变量*/ do /*循环*/ { ch = getch(); /*获取键盘输入*/ if(isupper(ch)) /*判断是否是大写字母*/ { printf("%c ",ch); /*显示出字符*/ } } while(ch != 27); /*遇到Esc退出本程序*/ return 0;/*函数返回*/ }
【运行结果】
输入1:无显示
输入7:无显示
输入A:A
输入 a:无显示
输入g: 无显示
【实例讲解】例子中使用do…while循环语句检测输入的字符是不是大写字母,如果是则显示出来,不是大写字母的没做处理,就像是用户不能输入大写字母以外的字符一样。
2 字符
本节介绍如何使用函数判定字符是否是ASCII码、普通控制字符、标点符号、可打印、空白字符(包括空格、水平制表符、回车符、走纸换行、垂直制表符以及换行符)。
2.1 判断字符是否为ASCII码isascii()
【函数原型】int isascii(int c)
【功能讲解】判断字符是否是ASCII码,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程能判定用户输入的是否是ASCII码,并显示出其对应的字符和ASCII码值,按Esc结束程序。
/*函数isascii()示例*/ #include<ctype.h>//函数isascii()所在头文件 int main(void) { /*定义字符变量*/ char ch; do/*循环*/ { /*获取键盘输入*/ ch = getch(); /*判断是否是ASCII码*/ if(isascii(ch)) { /*显示出字符和对应的ASCII值*/ printf("%c 是ASCII码,对应数值为%d ",ch,ch); } } /*遇到Esc退出本程序*/ while(ch != 27); /*函数返回*/ return 0; }
【运行结果】
输入字符Q显示:Q是ASCII码,对应的数值为81
输入字符q显示:q是ASCII码,对应的数值为113
输入字符a显示:a是ASCII码,对应的数值为97
输入字符2显示:2是ASCII码,对应的数值为50
输入字符3显示:3是ASCII码,对应的数值为51
【实例讲解】ASCII码是美国标准信息交换码(American Standard Code for Information Interchange),字母和各种字符必须按照特定的规则用二进制编码才能在计算机中表示。编码方式可以有很多种,ASCII码是其中最常见的一种。标准ASCII码用七位二进制编码,有128个。例子使用do…while循环检测每一个输入的字符,如果是ASCII码则显示出对应的数值,直到遇到按键盘“ESC”退出本程序。
2.2 判断字符是否为控制字符iscntrl()
【函数原型】int iscntrl(int c)
【功能讲解】判断字符是否是控制字符,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】因为控制字符一般是不可显示的,所以使用控制字符的ASCII码值初始化一个数组,判定该码值对应的字符是否是控制字符并显示出来。
/*函数iscntrl()示例 判定字符是否是控制字符并显示出来。 */ #include<ctype.h>/*函数iscntrl()所在头文件*/ int main(void) { /*定义字符变量*/ char ch[] = {0x00,0x01,0x1f,0x7f}; /*循环*/ int i = 0; for(i = 0;i<4;i++) { /*判断是否是控制码*/ if(iscntrl(ch[i])) { /*显示出字符*/ printf("%x 是控制字符 ",ch[i]); } else { printf("%x 不是控制字符 ",ch[i]); } } /*函数返回*/ return 0; }
【运行结果】
0 是控制字符
1 是控制字符
1f 是控制字符
7f 是控制字符
【实例讲解】控制字符是表示某一控制功能的字符,一般出现在特定的信息文本中。字符数值在0x00-0x1f之间,0x7f也是。本程序就是随意在这些数值中挑选几个用iscntrl()判定,如果你调试本例子可以自选数值试验。
2.3 判断字符是否为可打印字符(不含空格)isgraph()
【函数原型】int isgraph(int c)
【功能讲解】判断字符是否是不为空格的可打印字符,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】判断字符数组中哪些字符是否是不为空格的可打印字符,如果是则显示该字符可打印,否则显示该字符不可打印。
/*函数isgraph()示例 判定字符是否是控制字符(不含空格)并显示出来。 */ #include<ctype.h>/*函数isgraph()所在头文件*/ int main(void) { /*定义字符变量*/ char ch[] = "&^d 45"; /*循环*/ int i = 0; for(i = 0;ch[i]!=0;i++) { /*判断是否是可打印字符(不含空格)*/ if(isgraph(ch[i])) { /*显示出字符*/ printf("%c 是可打印字符 ",ch[i]); } else { printf("%c 不是可打印字符 ",ch[i]); } } /*函数返回*/ return 0; }
【运行结果】
& 是可打印字符
^ 是可打印字符
d 是可打印字符
不是可打印字符
4 是可打印字符
5 是可打印字符
【实例讲解】基本的ASCII字符集共有128个字符,其中有96个是可打印的,包括字母、数字、标点符号等,其他的是控制字符。本例子使用的函数即是判断字符是否是(不包含空格)可打印字符,看运行结果是不是跟你想的一样。
2.4 判断字符是否为可打印字符(含空格)isprint()
【函数原型】int isprint(int c)
【功能讲解】判断字符是否是的可打印字符,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】判断哪些字符是否是(含空格)可打印字符。
/*函数isprint()示例 判定字符是否是控制字符(含空格)并显示出来。 */ #include<ctype.h> int main(void) { /*定义字符变量*/ int ch[] = {'a',' ',0x30,0x7f}; /*循环*/ int i = 0; for(i = 0;i<4;i++) { /*判断是否是可打印字符(含空格)*/ if(isprint(ch[i])) { /*显示出字符*/ printf("%c 是可打印字符 ",ch[i]); } } /*函数返回*/ return 0; }
【运行结果】
a 是可打印字符
0 是可打印字符
【实例讲解】基本的ASCII字符集共有128个字符,其中有96个是可打印的,包括字母、数字、标点符号等,其他的是控制字符。本例子使用的函数即是判断字符是否是可打印字符,看运行结果是不是跟你想的一样。
2.5 判断字符是否为标点符号ispunct()
【函数原型】int ispunct(int c)
【功能讲解】判断字符是否是标点符号,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程允许用户任意输入字符,判断其是否是标点符号,如果是则显示该字符是标点符号,否则显示该字符不是标点符号。
/*函数ispunch()示例*/ #include<ctype.h> int main(void) { /*定义字符变量*/ char ch; do/*循环*/ { /*获取键盘输入*/ ch = getch(); /*判断是否是标点符号*/ if(ispunct(ch)) { /*显示出字符*/ printf("%c 是标点符号 ",ch); } else { /*显示出字符*/ printf("%c 不是标点符号 ",ch); } } /*遇到Esc退出本程序*/ while(ch != 27); /*函数返回*/ return 0; }
【运行结果】
输入a显示:a不是标点符号
输入5显示:5不是标点符号
输入`显示:`是标点符号
输入!显示:!是标点符号
【实例讲解】标点符号是书面上用于标明句读和语气的符号。例子使用do…while循环检测键盘输入的字符是不是标点符号,并显示出来,直到遇到ESC退出程序。
2.6 判断字符是否为空白字符isspace()
【函数原型】int ispunct(int c)
【功能讲解】判断字符是否是空白字符,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】分析一个带空白字符的字符串,逐个检测字符是不是空白字符,如果不是则显示出来,否则不做处理。
/*函数isspace()示例*/ #include <ctype.h> int main(void) { /*字符串包含空白字符 表示水平制表符, 表示回车 换行*/ char str[] = "I will be a better man! "; int i=0; /*逐个字符检测是否是空白字符*/ for(i = 0;i<strlen(str);i++) { if(isspace(str[i])) { /*空白字符不显示*/ } else { /*显示非空白字符*/ printf("%c",str[i]); } } /*输出一个换行符号,输出个换行符号只是为了运行结果干净整洁,无其它意思*/ printf(" "); return 0; }
【运行结果】
Iwillbeabeterrman!
【实例讲解】空白字符包括空格、水平制表符、垂直制表符、换页、回车和换行等等,本例首先定义一个字符串,故意在其中包含空白字符,然后通过for循环逐个字符检测,如果不是空白字符则显示出来,最后显示的就是除去空白字符以后的字符了。
2.7 判断字符是否为16进制字符isxdigit()
【函数原型】int isxdigit(int c)
【功能讲解】判断字符是否是16进制字符,如果是则返回非零值,否则返回零。
【参数说明】需要判断的字符。
【程序示例】本例程允许用户任意输入一个字符,使用本函数判断是不是16进制字符,显示出对应的提示信息,在最后给出了16进制包含哪里字符。
/*函数isxdigit()示例*/ #include<ctype.h>/*函数isxdigit()所在头文件*/ #include<stdio.h> int main(void) { char ch; /*定义字符变量*/ ch = getch();/*获取键盘输入*/ while(ch != 27)/*循环*/ { if(isxdigit(ch)) /*判断是否是16进制符号*/ { printf("%c 是16进制字符 ",ch); /*显示出字符*/ } else { printf("%c 不是16进制字符 ",ch); /*显示出字符*/ } ch = getch();/*获取键盘输入*/ } //while(ch != 27); /*遇到Esc退出本程序*/ printf("16进制字符包括:0123456789ABCDEF "); /*显示出字符*/ return 0; /*函数返回*/ }
【运行结果】
输入字符1显示:1是16进制字符
输入字符9显示:9是16进制字符
输入字符A显示:A是16进制字符
输入字符F显示:F是16进制字符
输入字符Q显示:Q不是16进制字符
输入字符L显示:L不是16进制字符
输入ESC显示:16进制字符包括:0123456789ABCDEF
【实例讲解】16进制是计算机中数据的一种表示方法,它由0-9以及A-F组成,我们日常使用的数据是10进制的,逢10进1,而16进制则是逢16进1。这个例子跟之前的基本一样,使用while循环获取用户输入的字符,然后使用isxdigit()判断是不是16进制字符,以按下ESC键结束本程序。
这么多只是C整个库的一部分,需要全部记忆吗?现在当然不用,用到哪里去查就行了。