所谓字符,就是文字符号。可以用键盘“写”字符,也可以在显示器上显示字符,但在计算机内部并不能真正存储字符。因为计算机内部只能存储二进制数。
为此,专门的机构把需要存储和传输的字符编号——即所谓编码。向计算机内输入字符时,在计算机内部存储字符实际上存储的是字符的编号,输出字符时,根据字符的编号由特定的软件再“画”出这些字符。
程序读取数据,通常必须预先为数据预备存储空间,为数据预备存储空间可以通过定义变量的手段来实现。存储字符的变量一般定义为char类型,这种数据类型占1B的内存空间。
C程序可以通过调用scanf()函数读入字符,转换说明为%c。
它表示的含义是读入键盘上输入的字符然后把该字符的编号写在c这个变量中。
如果程序的运行环境采用ASCII码字符集的话,那么由于在ASCII码表中西文字母的编号是按照字母顺序连续编排的,所以小写字母与对应大写字母的编号的差值是一个常数。这个常数可以写作 'a'-'A',式子中'a'是一个int类型的常量,其值为小写字母a的编号,'A'也是一个int类型的常量,其值为大写字母A的编号。这样就可以由大写字母的编码求出其对应小写字母的编码——c+('a'-'A')。因此题目的代码可以写为:
- /*
- 编程,输入一个大写字母字符,输出其小写字母字符。
- */
- #include <stdio.h>
- #include <stdlib.h>
- int main(void)
- {
- char c;
-
- printf("请输入一个大写字母:");
- scanf("%c",&c);
-
- printf("%c对应的小写字母为%c\n",
- c , c + ('a'-'A') );
-
- system("PAUSE");
- return 0;
- }
函数调用scanf("%c",&c)中,与“%c”对应的参数“&c”中“&”后面的c必须是一个char类型的变量(严格地说必须是一个char类型的左值表达式)。很多初学者容易犯下面的错误:
由于int类型的变量i占的空间大于char类型数据所占用的空间(1B),而“%c”的含义是只向一个字节内写数据,这样变量i中只有一个字节被写入数据,其余的字节则是毫无意义的垃圾值。因此从总的效果来说,最后i中的值在调用scanf("%c",&i)之后依然是没有意义的垃圾值。
但是,对于printf()来说,与“%c”对应的参数则可以是char类型也可以是int类型。因为根据C语言类型转换规则,char类型的值会被隐式地转换为int类型,因此
- printf("%c对应的小写字母为%c\n", c , c + ('a'-'A') )
实际上表达的是
- printf("%c对应的小写字母为%c\n", (int)c , (int)c + ('a'-'A') )
同理,在printf()中与%d对应的参数可以是char类型,也可以是int类型,因为char类型的参数会被转换为int类型。
c + ('a'-'A')这个表达式有人喜欢写成c+32,效果上两者是一致的。但是c+32是比较差的风格。因为很明显它不如c + ('a'-'A')的含义清晰明白。32这种在代码中出现的莫名其妙的常数叫Magic number,应该避免。如果在代码中多次出现('a'-'A')又嫌多次书写('a'-'A')过于麻烦,可以用一个符号常量来表示它:
输入字符的另一种常用方法是调用getchar()函数。getchar()函数读入从键盘输入的一个字符,getchar()函数调用表达式的值为所读入字符的编码(int类型)。所以这个问题的代码也可以写为
- /*
- 编程,输入一个大写字母字符,输出其小写字母字符。
- */
- #include <stdio.h>
- #include <stdlib.h>
- #define CHA ('a'-'A')
- int main(void)
- {
- putchar( getchar() + CHA );
-
- system("PAUSE");
- return 0;
- }
阅读(2758) | 评论(0) | 转发(0) |