Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229339
  • 博文数量: 39
  • 博客积分: 1130
  • 博客等级: 少尉
  • 技术积分: 453
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-26 15:54
文章分类

全部博文(39)

文章存档

2012年(1)

2011年(31)

2010年(7)

分类: C/C++

2011-11-18 19:49:25

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

 
阅读(2758) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~