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

目录

前言

总结摆在前面

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;
}

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

  • 54
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
目 录 第1章 C语言 8 1.1 什么是局部程序块(local block)? 8 1.2 可以把变量保存在局部程序块中吗? 9 1.3 什么时候用一条switch语句比用多条if语句更好? 9 1.4 switch语句必须包含default分支吗? 10 1.5 switch语句的最后一个分支可以不要break语句吗? 11 1.6 除了在for语句中之外,在哪些情况下还要使用逗号运算符? 11 1.7 怎样才能知道循环是否提前结束了? 13 1.8 goto,longjmp()和setjmp()之间有什么区别? 13 1.9 什么是左值(lvaule)? 15 1.10 数组(array)可以是左值吗? 15 1.11 什么是右值(rvaule)? 16 1.12 运算符的优先级总能保证是“自左至右”或“自右至左”的顺序吗? 17 1.13 ++var和var++有什么区别? 17 1.14 取模运算符(modulus operator)“%”的作用是什么? 17 第2章 变量和数据存储 18 2.1. 变量存储在内存(memory)中的什么地方? 18 2.2. 变量必须初始化吗? 19 2.3. 什么是页抖动(pagethrashing)? 19 2.4. 什么是const指针? 20 2.5. 什么时候应该使用register修饰符?它真的有用吗? 21 2.6. 什么时候应该使用volatile修饰符? 21 2.7. 一个变量可以同时被说明为const和volatile吗? 22 2.8. 什么时候应该使用const修饰符? 23 2.9. 浮点数比较(floating-point comparisons)的可靠性如何? 23 2.10. 怎样判断一个数字型变量可以容纳的最大值? 24 2.11. 对不同类型的变量进行算术运算会有问题吗? 25 2.12. 什么是运算符升级(operatorpromotion)? 25 2.13. 什么时候应该使用类型强制转换(typecast)? 26 2.14. 什么时候不应该使用类型强制转换(typecast)? 27 2.15. 可以在头文件中说明或定义变量吗? 27 2.16. 说明一个变量和定义一个变量有什么区别? 27 2.17. 可以在头文件中说明static变量吗? 28 2.18. 用const说明常量有什么好处? 28 第3章 排序与查找 28 排序 28 查找 29 排序或查找性能? 30 3.1. 哪一种排序方法最方便? 32 3.2. 哪一种排序方法最快? 33 3.3. 对外存(磁盘或磁带)中而不是内存中的数据进行排序称为外部排序。 39 3.4. 1哪一种查找方法最方便? 44 3.5. 1哪一种查找方法最快? 46 3.6. 1什么是哈希查找? 51 3.7. 1怎样对链表进行排序? 53 3.8. 1怎样查找链表中的数据? 53 第4章 数据文件 59 4.1. 当errno为一个非零值时,是否有错误发生? 59 4.2. 什么是流(stream)? 59 4.3. 怎样重定向一个标准流? 60 4.4. 怎样恢复一个重定向了的标准流? 60 4.5. stdout能被强制打印到非屏幕设备上吗? 61 4.6. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 61 4.7. 怎样判断是使用流函数还是使用低级函数? 62 4.8. 怎样列出某个目录下的文件? 62 4.9. 怎样列出一个文件的日期和时间? 63 4.10. 怎样对某个目录下的文件名进行排序? 66 4.11. 怎样判断一个文件的属性? 67 4.12. 怎样查看PATH环境变量? 69 4.13. 怎样打开一个同时能被其它程序修改的文件? 69 4.14. 怎样确保只有你的程序能存取一个文件? 71 4.15. 怎样防止其它程序修改你正在修改的那部分文件内容? 71 4.16. 怎样一次打开20个以上的文件? 72 4.17. 怎样避开"Abort,Retry,Fail”消息? 72 4.18. 怎样读写以逗号分界的本? 74 第5章 编译预处理 76 5.1. 什么是宏(macro)?怎样使用宏? 76 5.2. 预处理程序(preprocessor)有什么作用? 77 5.3. 怎样避免多次包含同一个头文件? 79 5.4. 可以用#include指令包含类型名不是".h"的文件吗? 80 5.5. 用#define指令说明常量有什么好处? 80 5.6. 用enum关键字说明常量有什么好处? 81 5.7. 与用#define指令说明常量相比,用enum关键字说明常量有什么好处? 81 5.8. 如何使部分程序在

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值