测试字符与大小写转换

字符(char)在底层以整数形式存储(通常为 ASCII 码),因此可以直接使用关系运算符进行大小比较和算术运算。

1. 字符的底层表示与比较规则

  • 存储本质:字符放在单引号中(如 'A'),本质是对应 ASCII 码的整数。大写 A~Z 为 65~90,小写 a~z 为 97~122。
  • 大小写差值:小写字母比对应大写字母大 32(如 'a' - 'A' = 32)。
  • 比较示例解析:
表达式结果原因(ASCII值)
'Z' >= 'A'true90 >= 65
'Q' <= 'P'false81 > 80(Q在P后面)
'B' <= 'b'true66 <= 98(小写大32)
'B' != 66false66 == 66(相等)

2. 基础转换与嵌套判断的演进

核心转换公式:小写 = 大写 + 32(即 letter - 'A' + 'a' 或 letter + 32)。

教程通过逐步纠错展示了嵌套 if 的边界缺陷:

  1. 初版:仅判断 >= 'A' 且 <= 'Z',漏判了小于 'A' 和大于 'Z' 的情况。
  2. 加括号版:补充了 else 分支,但输入 [(ASCII 91)时,大于 'Z' 却不属于小写字母,提示语逻辑仍不严谨。
  3. 多层嵌套版:试图区分小写字母和非字母,但层级过深导致可读性极差且仍有漏洞。

3. 最终版本

#include <stdio.h>

int main(void)
{
    char letter = 0;
    printf("请输入一个大写字母:"); 
    scanf("%c", &letter);
    
    if(letter >= 'A') 
    {
        if (letter <= 'Z') 
        {   
            letter = letter + 32; /* 大写转小写 */
            printf("你输入的字母的对应小写字母是 %c\n", letter);
        }
        else
        {
            if(letter >= 'a')
            {
                if(letter <= 'z')
                    printf("试试用Caps Lock键,我要一个大写字母.\n");
                else
                    printf("您输入的不是一个字母\n"); 	
            }
            else
                printf("您输入的不是一个字母\n");     	
        }
    }
    else	
    {
        printf("您输入的不是一个字母\n"); 
    } 			
    return 0;
}Code language: PHP (php)

逻辑覆盖:

  • 65~90(A~Z):转小写输出。
  • 97~122(a~z):提示已输入小写。
  • 其他字符(如 < 65 的 @ 或 > 122 的 {):提示非字母。

遗留局限:输入数字(如 '5' ASCII 53)会落入 < 'A' 分支提示“不是字母”(合理);但输入大写字母后加回车符(\n ASCII 10)若被读取会误判。且多层嵌套极度冗长。

4. 标准库方案

实际开发中绝不手写嵌套判断,直接使用 <ctype.h> 库函数:

  • tolower(letter):转小写
  • toupper(letter):转大写
  • isupper(letter) / islower(letter) / isalpha(letter):判断字符类型

精简且严谨的推荐写法:

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    char letter = 0;
    printf("请输入一个大写字母:"); 
    scanf("%c", &letter);
    
    if(isupper(letter)) {
        printf("对应小写是 %c\n", tolower(letter));
    } else if(islower(letter)) {
        printf("试试用Caps Lock键,我要一个大写字母.\n");
    } else {
        printf("您输入的不是一个字母\n"); 
    }
    return 0;
}Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注