getchar()和putchar()
到目前为止,出现的大多是程序都需要输入数值。接下来看看那输入字符的示例。scanf()和printf()根据%c转换说明读写字符已经老生常谈,getchar()和putchar()也可以做到,他们是字符输入/输出函数。
getchar()函数不带任何参数,它从输入列表中返回下一个字符,例如读取下一个字符输入,并赋给变量ch 。
ch = getchar( ) ;这条语句和scanf("%c", &ch );等同
同样的ch = putchar();这条语句和printf( "%c", ch );等同
由于这两个函数只处理字符,所以它们比scanf()和printf()更快、更简洁。而且,getchar()和putchar()不需要转换说明。getchar()和putchar()通常定义在stdio.h头文件中(这倒是和scanf()和printf()一样了)
/*cypher.c -- 更改输入,空格不变*/
#include <stdio.h>
#define SPACE ' '
int main(void)
{
char ch;
ch = getchar();
while(ch != '\n'){
if(ch == SPACE){
putchar(ch);
}else{
putchar(ch + 1);
}
ch = getchar();
}
putchar(ch);
return 0;
}
运行一下:
CALL ME RJF
DBMM NF SKG
前面的程序中常出现如下语句:
while(scanf("%lu", &num) == 1)
这里的getchar()同样可这么用:
while((ch = getchar()) != '\n')
注意,在后者中多了一个(),这是由于!=的优先级高于=,如果没有()先计算的就将是getchar( ) != ‘\n’,其运算结果将是0或1(真或假),然后将0或1赋给ch。这不是我们的初衷,所以如果要使用这种方法一定不能忘了加上()。
ctype.h系列的字符函数
在程序cypher1.c中有一些不太好的地方 ,比如,如果输入的不是字母而是一些符号比如" . " ,转换得到的将是“ / ”,因为在C提供的ASCII中,反斜杠”/“比“ . ”的ASCII值多1 。后面将会讲到如何用逻辑运算符来测试字符是不是空格,逗号之类的符号,但列出所有的可能性实在太繁琐。C有一些列专门处理字符的函数。ctype.h头文件包含了这些函数的原型。这些函数接受一个字符作为参数,如果该字符属于特定的类别,就返回一个非零值(真),否则就返回一个0(假)。
在cypher1.c中输入Look! It is a programmer!,来看看运行结果如何,
Look! It is a programmer!
Mppl" Ju jt b qsphsbnnfs"
真印证了上面所提到的,cypher1.c将所有的字符都加了1,而我们希望保留下原有的符号。cypher2.c就能满足这一要求:
/*cypher2.c -- 更改输入,符号不变*/
#include <stdio.h>
#define SPACE ' '
int main(void)
{
char ch;
ch = getchar();
while(ch != '\n'){ // while((ch = getchar()) != '\n')
if(isalpha(ch)){
putchar(ch + 1);
}else{
putchar(ch);
}
ch = getchar();
}
putchar(ch);
return 0;
}
Look! It is a programmer!
Mppl! Ju jt b qsphsbnnfs!
下面列出了头文件 ctype.h 中定义的函数:
序号 | 函数 & 描述 |
---|---|
1 | int isalnum(int c) 该函数检查所传的字符是否是字母和数字。 |
2 | int isalpha(int c) 该函数检查所传的字符是否是字母。 |
3 | int iscntrl(int c) 该函数检查所传的字符是否是控制字符。 |
4 | int isdigit(int c) 该函数检查所传的字符是否是十进制数字。 |
5 | int isgraph(int c) 该函数检查所传的字符是否有图形表示法。 |
6 | int islower(int c) 该函数检查所传的字符是否是小写字母。 |
7 | int isprint(int c) 该函数检查所传的字符是否是可打印的。 |
8 | int ispunct(int c) 该函数检查所传的字符是否是标点符号字符。 |
9 | int isspace(int c) 该函数检查所传的字符是否是空白字符。 |
10 | int isupper(int c) 该函数检查所传的字符是否是大写字母。 |
11 | int isxdigit(int c) 该函数检查所传的字符是否是十六进制数字。 |
标准库还包含了两个转换函数,它们接受并返回一个 "int"
序号 | 函数 & 描述 |
---|---|
1 | int tolower(int c) 该函数把大写字母转换为小写字母。 |
2 | int toupper(int c) 该函数把小写字母转换为大写字母。 |