大小写字母、数字与ASCII间的关系
在C语言中,常常需要判断某一个字母是大写字母,小写字母,或者是数字,因此就涉及到一些字母的ASCII码的运算。
1. 常用ASCII表(一定要牢牢记住)
0~9 : 48~57
A-Z : 65~90
a-z : 97~122
// 例如用整型输出字符,则会自动转化为int类型,即输出对应的ascii码
char c = 'a';
printf("%d", c);
// 输出结果为97
2. 字母与数字之间的转化
大家常见的需求通常如下这里希望大家注意,不要搞混淆了
:
- 判断是否为大小写字母
- 判断是否为数字
- 统计大小写字母、数字出现的次数
- 大小写字母转化
首先,判断是否为大
写字母
char c = 'B';
if (c >= 65 && c <= (65+25)){
printf("这是一个大写字母");
}
判断是否为小
写字母
char c = 'm';
if (c >= 97 && c <= (97+25)){
printf("这是一个小写字母");
}
判断是否为数字
char c = '9';
// 方法1: 通过减去'0'直接转化为整型对应的数值
if (c - '0' >= 0 && c - '0' <= 9){
printf("这是一个数字");
}
// 方法2: 通过记住了对应的ASCII码,直接进行比较是否在对应区间内
if (c >= 48 && c <= 57){
printf("这是一个数字");
}
大小写字母转化
// 根据大小写之间的字母差为32,先判断为为大写还是小写,再转化
char s[] = "Hello";
// 需要注意的是:计算得到的长度为数组真实长度+1,因为有一个'\0'结尾
int len = sizeof(s) / sizeof(s[0]); // 6
// 开始判断
int diff = 'a' - 'A'; // 大小写字母之间的ASCII的差:32
for(int i = 0; i < len; i++){
if (s[i] >= 65 && s[i] <= 90){
// s[i]为大写字母,那么转化为小写
s[i] = s[i] + diff;
}else if(s[i] >= 97 && s[i] <= 122){
// s[i]为小写字母,那么转化为大写
s[i] = s[i] - diff;
}
printf("%c", s[i]);
}
3. 字符串长度补充
相信大家也很疑惑,为啥s数组的长度比真实长度多1,为此做了如下输出实验
char s1[5] = "Hello";
char s2[] = "Hello";
int length1 = sizeof(s1) / sizeof(s1[0]);
int length2 = sizeof(s2) / sizeof(s2[0]);
printf("%d, %d", length1, length2);
printf("%s, %s", s1, s2);
// 输出结果为:
5, 6
Hello, Hello
这是因为不置顶数组长度,那么为自动加一个’\0’作为结尾符
但是输出结果一样哈,不会输出\0