目录
前言
总结摆在前面
1.指针思考的拓展
2.浅提一下表达式求值
三种方法
1.利用ASCII相差32
1.1以表达式求值的思考方式
1.2以指针的方式
2.通过按位异或来求(我觉得太巧合了,不推荐)
3.通过库函数(这个看你积累)
3.1 tolower函数——转换字符位小写
定义
参数
返回值
3.2 toupper——转换字符为大写
定义
参数
返回值
3.3上代码
前言
经过网上资料的参考和自己的总结,c语言大小写字母转换至少有三种方法。对于我们c语言初学者来说,其实可以通过该问题的思考,从ASCII表到表达式求值再指针,初步感受他们的魅力所在。
总结摆在前面
1.指针思考的拓展
指针广义上来说,可以不仅仅是十六进制的地址,ASCII中的值又何尝不是一种地址,告诉你ASCII的值就相当于告诉了他的指针,通过指针我们可以找到其对应的字符。对ASCII值(指针)进行加减运算,可以得到另一个指针,对应另一个字符。如
dec | ch |
65 | A |
97 | a |
A的ASCII值为65,也可以理解为A的地址(指针)是65(0x41),指针加32,变为97,指针最后就指向了字符a。
2.浅提一下表达式求值
对于表达式求值,笔者在从二进制和内存的底层来探究同一数据在不同类型下的调用(链接)中分享了我对表达式求值的思考。这里我再分享一些新的看法
不管是定义一个变量,数组,抑或是函数,首先都有一个地址,地址一定会返回一个值(真数字),然后再根据你的数据类型,转换成或int,或char等的数据。
char ch = 'A' + 32;
我们要将’A'+32看成表达式求值,为97,char类型的97就是a了。
三种方法
1.利用ASCII相差32
1.1以表达式求值的思考方式
#include<stdio.h>int main(){ char ch; printf("请输入:>>"); scanf("%c", &ch); if (ch >= 'a' && ch <= 'z') { ch -= 32; printf("%c\n", ch); } else if (ch >= 'A' && ch <= 'Z') { ch += 32; printf("%c\n", ch); } else { printf("输入的不是大写或者小写字母\n"); } return 0;}
1.2以指针的方式
#include<stdio.h> int main(){ char a; printf("请输入:>>"); scanf("%c", &a); if (a <= 91) { a += 32; printf("%c\n", a); } else { a -= 32; printf("%c\n", a); }return 0;}
是不是感觉跟第一个好像没什么两样,只是一个是97,一个是’a'而已,97相当于指针,把‘a'当成表达式,求值就是97.
2.通过按位异或来求(我觉得太巧合了,不推荐)
0 ^ n = n
-1 ^ n = ~n
n ^ n = 0
满足交换律和结合律,不满足分配律 存在逆运算:
a = b ^ c <<====>>b = a ^ c && c = a ^ b
ch | dec | BIN |
A | 65 | 0100 0001 |
a | 97 | 0110 0001 |
举个例子,其他字母也是一个道理,A,a的二进制后4位都一样,只是前四位不一样,我们就希望A的能变a,a能变A,由于抑或具有逆运算,只需要找到他们的过度系数就行了。然后,经过尝试,也可以说是凑,真有这么个数字32(0010 0000),可以,所以,就可以了。不是说能求出来太巧合了,其他问题能这么干么?
#include<stdio.h> int main(){ char a; printf("请输入一个字母:"); scanf("%c", &a); if ((a >= 'A') && (a <= 'Z') || (a >= 'a') && (a <= 'z')) { arr[i] ^= 32; }printf("%c",a);return 0;}
3.通过库函数(这个看你积累)
首先要包含c标准库<ctype.h>.
3.1 tolower函数——转换字符位小写
定义
int tolower( int ch );
参数
ch | - | 要转换的字符。若 ch 的值不能表示为 unsigned char 且不等于 EOF ,则行为未定义 |
返回值
ch
的小写版本,或若无列于当前 C 本地环境的小写版本,则为不修改的 ch
。
3.2 toupper——转换字符为大写
定义
int toupper( int ch );
参数
ch | - | 要转化的字符。若 ch 的值不能表示为 unsigned char 且不等于 EOF ,则行为未定义。 |
返回值
被转换的字符,或若当前 C 本地环境不定义大写版本则为 ch
。
3.3上代码
#include<stdio.h>#include<ctype.h>int main(){ char ch; printf("请输入一个字符:\n"); scanf("%c", &ch); if (ch >= 'a' && ch <= 'z') { ch = toupper(ch); printf("%c\n", ch); } else if (ch >= 'A' && ch <= 'Z') { ch = tolower(ch); printf("%c\n", ch); } else { printf("输入的不是大写或者小写字母\n"); } return 0;}
最后,代码都是直接就能运行的,感兴趣的小伙伴可以直接拿去运行。然后再多多感谢各位大佬们的支持与指正,我也会不负众望,多多学习,持续更新优质文章。谢谢大家