前面介绍过使用scanf()和printf()根据%c转换说明读写字符,同时也介绍过在输入字符时,用专门的字符处理函数效率会更高,下面将介绍两个读取和输出字符的函数:getchar()和putchar()。
1.getchar()和putchar()
getchar()函数不带任何参数,它从输入队列中返回下一个字符,如ch = getchar();
,与scanf("%c", &ch);
效果相同。putchar()函数打印它的参数,putchar(ch);
与printf("%c", ch);
效果相同。但由于这些只处理字符,所以它们更快、更简洁,而且getchar()和putchar()不需要转换说明,因为它们只处理字符,这两个函数通常定义在stdio.h头文件中,它们通常是预处理宏,而不是真正的函数。
下面编写一个程序,以实现:如果字符是空白,则原样打印;否则,打印原字符在ASCII序列的下一个字符。
#include <stdio.h>
#define SPACE ' '
int main(void){
char ch;
while((ch = getchar()) != '\n'){ //输出不是换行符则执行循环体
if(ch == SPACE) //字符是空格,原样打印
putchar(ch);
else
putchar(ch + 1); //打印下一个字符
}
putchar(ch); //打印换行符
return 0;
}
2.ctype.h系列的字符函数
上述程序实现对字符的转换打印,但没有打印出来的效果并不是特别好看,因为有些非字母字符,可能打印出看起来并不好,如果能够只对字母字符进行处理,效果会好很多,但是可能增加编程的复杂度。C语言有一系列专门处理字符的函数,ctype.h头文件包含了这些函数的原型,这些函数接受一个字符作为参数,如果这些字符属于某些特殊的类别,则返回一个非零值,否则返回0。
#include <stdio.h>
#include <ctype.h> //包含isalpha函数原型
int main(void){
char ch;
while((ch = getchar()) != '\n'){ //输出不是换行符则执行循环体
if(isalpha(ch)) //如果ch是字母,isalpha返回一个非0值
putchar(ch + 1);
else
putchar(ch); //否则,原样打印
}
putchar(ch); //打印换行符
return 0;
}
下表是ctype.h头文件中的一些函数:
字符测试函数 | 属于下列参数,返回值为真(非0) |
isalnum() | 字母或数字 |
isalpha() | 字母 |
isdigit() | 数字 |
isprint() | 可打印字符 |
isgraph() | 除空格之外的可打印字符 |
ispunct() | 标点符号 |
isblank() | 标准空格符(空格、水平制表符或换行符)或本地指定空白字符 |
isspace() | 空白字符(外加回车符、换页符、垂直制表符) |
islower() | 小写字母 |
isupper() | 大写字母 |
字符映射函数不会修改原始的参数,这些函数只会返回已修改的值。
字符映射函数 | 行为 |
tolower() | 如果参数是大写字母,则返回小写字母;否则,返回原始参数 |
toupper() | 如果参数是小写字母,则返回大写字母;否则,返回原始参数 |