【C语言】五种方法实现C语言中大小写字母的转化

请添加图片描述

文章目录

  • 📝tolower/toupper函数
    • 🌉tolower
    • 🌠 toupper
  • 🌠 ASCII码关系
    • 🌉位操作
    • 🌉宏定义
  • 🌠小巧第五位
  • 🚩总结


📝tolower/toupper函数

🌉tolower

tolower函数是C标准库中用于将字母从大写转换为小写的函数。
函数原型:

int tolower(int c);
c: 需要转换的字符,必须是unsigned char类型或可隐式转换为unsigned char类型的值。

返回值:
返回转换后的小写字符。如果c不是一个字母,则返回原值c。
返回值类型为int,这是为了能够返回任何可能的字符值。

注意:
c必须是unsigned char类型或能隐式转换为unsigned char,如char、int等。
返回值类型为int,是为了能够返回任何可能的字符值,包括非字母字符本身。
如果c不是一个字母,函数直接返回c而不进行转换。

代码:

# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>int main() 
{char uppercase = 'A';char lowercase = tolower(uppercase);printf("%c 转为小写是:%c\n", uppercase, lowercase);return 0;
}

在这里插入图片描述

🌠 toupper

toupper函数是C标准库中用于将字母从小写转换为大写的函数。

int toupper(int c);  

和tolower函数一样:

  • 参数c类型为int,需要转换的字符可以隐式转换为unsigned char

  • 返回值类型为int,返回转换后的大写字符或原字符c如果c不是字母

toupper函数和tolower函数的参数和返回值类型是完全相同的:
int tolower(int c);
int toupper(int c);
两者都以int类型作为参数和返回值,目的是为了能处理任何可能的字符值。

#include <stdio.h>
#include <ctype.h>int main() 
{char lowercase = 'a';char uppercase = toupper(lowercase);printf("%c 转为大写是: %c\n", lowercase, uppercase);return 0;
}

在这里插入图片描述

🌠 ASCII码关系

通过ASCII码表来进行大小写字母的转换。ASCII码表中小写字母的范围是97到122,大写字母的范围是65到90,它们之间相差32。因此,可以通过加上或者减去32来进行大小写字母的转换。

#include <stdio.h>char to_uppercase(char c) 
{if (c >= 'a' && c <= 'z') {// 如果是小写字母,则将ASCII码值减去32转换为大写字母return c - 32;}else {return c;}
}char to_lowercase(char c) {if (c >= 'A' && c <= 'Z') {// 如果是大写字母,则将ASCII码值加上32转换为小写字母return c + 32;}else {return c;}
}int main() 
{for (char lowercase = 'a'; lowercase <= 'z'; lowercase++){char uppercase = to_uppercase(lowercase);printf("%c 小转大: %c\n", lowercase, uppercase);}for (char uppercase2 = 'A'; uppercase2 <= 'Z'; uppercase2++){char lowercase2 = to_lowercase(uppercase2);printf("%c 大写转小写: %c\n", uppercase2, lowercase2);}return 0;
}

🌉位操作

二进制是由0和1组成的数字系统。在位运算中,&(按位与)、|(按位或)和~(按位取反)是常用的操作符。
这些运算符在二进制中的作用:

  • 按位与(&):对两个二进制数的对应位进行逻辑与操作,只有当两个位都是1时,结果才为1,否则为0。
  • 按位或(|):对两个二进制数的对应位进行逻辑或操作,只要有一个位是1,结果就为1。
  • 按位取反(~):对一个二进制数的每一位进行取反操作,即0变为1,1变为0。

现在我们用二进制来解释一下如何使用这些操作符进行大小写字母的转换。

假设我们有一个字符 'A',对应的ASCII码为65,其二进制表示为 01000001
小写字符‘a’为在这里插入图片描述

  1. 小写字母转换为大写字母:我们想要将其转换为小写字母 'a'

    我们知道大写字母和小写字母的ASCII码值之间差32。因此,我们可以通过将65的第6位(从右往左数,从0开始)设置为0来将其转换为小写字母。我们可以使用按位或操作符 | 来实现这一点。

    原始 ASCII:   01000001
    32的二进制:   00100000  <-- 这是32的二进制表示,它的第6位是1,其他位都是0
    按位或:       01100001  ('a'的ASCII码)
    

    这样,我们就成功地将大写字母 'A' 转换为小写字母 'a'

char toUpper(char c) 
{if (c >= 'a' && c <= 'z')return c & ~32; // Clear the 6th bit to convert to uppercaseelsereturn c;
}
  1. 大写字母转换为小写字母:我们想要将其转换为大写字母 'A'

    我们知道大写字母和小写字母的ASCII码值之间差32。因此,我们可以通过将小写字母的第6位设置为0来将其转换为大写字母。我们可以使用按位与操作符 & 和按位取反操作符 ~ 来实现这一点。

    原始 ASCII:   01000001
    按位取反:     10111110  <-- 这是65的按位取反结果
    32的二进制:   00100000  <-- 这是32的二进制表示,它的第6位是1,其他位都是0
    按位与:       01000000  ('A'的ASCII码)
    

    这样,我们就成功地将小写字母 'a' 转换为大写字母 'A'

#include <stdio.h>char toLower(char c) 
{if (c >= 'A' && c <= 'Z')return c | 32; elsereturn c;
}

🌉宏定义

32的16进制也是0x20,也可以这样用

#define TOLOWER(c) ((c) | 0x20) 
#define TOUPPER(c) ((c) & ~0x20)
int main()
{char c = 'A';c = TOLOWER(c); // c becomes 'a'printf("%c\n", c);char d = 'a';d = TOUPPER(d); // d becomes 'A'printf("%c\n", d);
}

在这里插入图片描述

🌠小巧第五位

上面了解位运算,并且用的是32的二进制进行第6位操作,还要取反(~)是不是觉得有点繁琐,能不能一步到位呢,这里有个小巧比较,以下用的是第五位进行操作:

  1. 小转大
#include <stdio.h>char to_uppercase(char c) 
{// 如果字符是小写字母,将第5位(32)置为0,即转换为大写字母return (c & 0xdf);
}

首先,我们知道大写字母的ASCII码值范围是65到90,而小写字母的ASCII码值范围是97到122。它们之间的差值恰好是32。

在ASCII码中,将小写字母转换为大写字母,实际上就是将对应字符的第5位(从右往左数,从0开始)置为0。

为了实现这一点,我们使用了按位与运算符 &,并将字符 c 与十六进制数 0xdf 进行按位与操作。0xdf 的二进制表示是 11011111,将其与字符 c 进行按位与操作,可以确保字符的第5位被置为0。

- 小写字母 `'a'` 的ASCII码值是97,其二进制表示为 `01100001`。
- 我们将其与 `0xdf` 进行按位与操作,
- 得到的结果是 `01100001 & 11011111 = 01000001`,
这就是大写字母 `'A'` 的ASCII码值。
  1. 大转小
char to_lowercase(char c) 
{// 如果字符是大写字母,将第5位(32)置为1,即转换为小写字母return (c | 0x20);
}
  • 类似地,将大写字母转换为小写字母实际上就是将对应字符的第5位置为1。
  • 为了实现这一点,我们使用了按位或运算符 |,并将字符 c 与十六进制数 0x20 进行按位或操作。0x20 的二进制表示是 00100000,将其与字符 c 进行按位或操作,可以确保字符的第5位被置为1。
- 大写字母 `'A'` 的ASCII码值是65,其二进制表示为 `01000001`。
- 我们将其与 `0x20` 进行按位或操作,
- 得到的结果是 `01000001 | 00100000 = 01100001`,
- 这就是小写字母 `'a'` 的ASCII码值。
int main() 
{char lowercase = 'l';char uppercase = to_uppercase(lowercase);printf("%c converted to uppercase is: %c\n", lowercase, uppercase);char uppercase2 = 'G';char lowercase2 = to_lowercase(uppercase2);printf("%c converted to lowercase is: %c\n", uppercase2, lowercase2);return 0;
}

在这里插入图片描述
通过这种方法,我们可以在不使用 <ctype.h> 中的函数的情况下,实现大小写字母之间的转换。


🚩总结

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540784.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能(AI)+、+了什么?互联网+又是什么?

引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;&#xff0c;作为一门迅猛发展的领域&#xff0c;自20世纪中叶以来一直在不断演进。它涉及计算机科学、机器学习和模式识别等多个学科&#xff0c;旨在开发可以模拟和执行人类智力任务的系统。…

学生考软考合适吗?

可以通过软考的报名要求看出来&#xff0c;软考是没有相关的年龄、学历、工作年限的规定的&#xff0c;所以大学生群体每年报名软考的有很多&#xff0c;在国内政策的支持下&#xff0c;不少的城市开始将这个证书划分到“入户必备”的区域&#xff0c;认可也从国企、央企慢慢过…

K8S日志收集方案-EFK部署

EFK架构工作流程 部署说明 ECK (Elastic Cloud on Kubernetes)&#xff1a;2.7 Kubernetes&#xff1a;1.23.0 文件准备 crds.yaml 下载地址&#xff1a;https://download.elastic.co/downloads/eck/2.7.0/crds.yaml operator.yaml 下载地址&#xff1a;https://download.e…

音频读取之wave和liborsa

wave 常见的语音信号处理python库有librosa, scipy, soundfile等等。wave库是python的标准库&#xff0c;对于python来说相对底层&#xff0c;wave不支持压缩/解压&#xff0c;但支持单声道/立体声语音的读取。 读取音频 import wave #导入库file_path D:/ba.wav #文件路径…

cesium-可视化区域分析

全部代码 <template><div id="cesiumContainer" style="height: 100vh;"></div><div id="toolbar" style="position: fixed;top:20px;left:220px;"><el-breadcrumb :separator-icon="ArrowRight&quo…

第2篇:1位二选一数据选择器

Q&#xff1a;创建1位二选一数据选择器&#xff0c;并在DE2-115开发板上通过滑动开关和LEDR硬件来实现。 A&#xff1a;基本原理&#xff1a;两个1位数据输入(x&#xff0c;y)&#xff0c;一个1位数据s控制&#xff08;高、低电平&#xff09;选择(x&#xff0c;y)其中一个数据…

xss.haozi.me靶场“0x00-0x0A”通关教程

君衍. 一、靶场介绍二、第一关 0x00 不做限制三、第二关 0x01 文本闭合标签绕过四、第三关 0x02 双引号闭合绕过五、第四关 0x03 过滤括号六、第五关 0x04 编码绕过七、第六关 0x05 注释闭合绕过八、第七关 0x06 换行绕过九、第八关 0x07 删除标签十、第九关 0x08 多加空格绕过…

[Redis]——Redis持久化的两种方式RDB、AOF

目录 RDB快照模式 概念&#xff1a; 触发时机&#xff1a; 异步做快照 AOF追加模式 概念&#xff1a; 触发时机&#xff1a; bgrewriteaof命令&#xff1a; 比较两种模式&#xff1a; RDB快照模式 概念&#xff1a; RDB模式就是保存当前Redis的状态到本地磁盘文件&am…

Vue2 父子组件某一属性的双向绑定

原本&#xff1a;父组件使用props传值给孩子组件初始化&#xff0c;触发事件子组件使用$emit传值给父组件&#xff0c;很麻烦后来&#xff1a;使用computed和$event例子代码&#xff1a; <template><div class"box">grandpa <el-input v-model"…

【网络】HTTP协议

目录 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接 1. 什么…

1、鸿蒙学习-为应用/服务进行签名

针对应用/服务的签名&#xff0c;DevEco Studio为开发者提供了自动签名方案&#xff0c;帮助开发者高效进行调试。也可选择手动方式对应用/服务进行签名&#xff0c;如果使用了需要ACL的权限&#xff0c;需采用手动方式进行签名。 自动签名 说明 使用自动签名前&#xff0c;请…

探讨大世界游戏的制作流程及技术——大场景制作技术概况篇

接上文&#xff0c;我们接下来了解一下大世界场景制作技术有哪些&#xff0c;本篇旨在给大家过一遍目前业界的做法&#xff0c;能让大家有一个宏观的知识蓝图。实际上&#xff0c;针对不同的游戏类型和美术风格&#xff0c;制作技术在细节上有着非常大的不同&#xff0c;业界目…