当前位置:首页 » 《随便一记》 » 正文

c语言大小写字母转换的三种方法 到 思考指针(超详细)

0 人参与  2024年02月22日 08:01  分类 : 《随便一记》  评论

点击全文阅读


目录

前言

总结摆在前面

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值(指针)进行加减运算,可以得到另一个指针,对应另一个字符。如

decch
65A
97a

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

chdecBIN
A650100 0001
a970110 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;}

最后,代码都是直接就能运行的,感兴趣的小伙伴可以直接拿去运行。然后再多多感谢各位大佬们的支持与指正,我也会不负众望,多多学习,持续更新优质文章。谢谢大家


点击全文阅读


本文链接:http://zhangshiyu.com/post/69391.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1