【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.mzph.cn/news/747263.shtml

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

相关文章

YOLOv7改进 | 更换主干网络之PP-LCNet

前言:Hello大家好,我是小哥谈。PP-LCNet是一个由百度团队针对Intel-CPU端加速而设计的轻量高性能网络。它是一种基于MKLDNN加速策略的轻量级卷积神经网络,适用于多任务,并具有提高模型准确率的方法。与之前预测速度相近的模型相比,PP-LCNet具有更高的准确性。此外,对于计…

掘根宝典之C++普通迭代器和反向迭代器详解

简介 迭代器是一种用于遍历容器元素的对象。它提供了一种统一的访问方式&#xff0c;使程序员可以对容器中的元素进行逐个访问和操作&#xff0c;而不需要了解容器的内部实现细节。 C标准库里每个容器都定义了迭代器&#xff0c;这迭代器的名字就叫容器迭代器 迭代器的作用类…

数字电子技术笔记——组合逻辑功能

1.Adder&#xff08;加法器&#xff09; Half-Adder&#xff08;半加器&#xff09; Full-Adder&#xff08;全加器&#xff09; 74LS283(4-bit parallel adders) 74LS283 4-bit parallel adders 81 input 41 output carry look-ahead adder &#xff08;超前进位加法器&a…

牛客 NC266925 我不是大富翁(dp)

原题 首先记录这一道题的目的是提醒自己&#xff1a;动态规划的属性并不是只有 m a x max max&#xff0c; m i n min min 和 c o u n t count count&#xff0c;同时还有布尔类型的dp 这题不能考虑在距离的维度上思考&#xff0c;比如说看走几步走到哪里了&#xff0c;如果…

C++进阶之路---手把手带你学习AVL树

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#…

图像处理与视觉感知---期末复习重点(3)

文章目录 一、空间域和频率域二、傅里叶变换三、频率域图像增强 一、空间域和频率域 1. 空间域&#xff1a;即所说的像素域&#xff0c;在空间域的处理就是在像素级的处理&#xff0c;如在像素级的图像叠加。通过傅立叶变换后&#xff0c;得到的是图像的频谱&#xff0c;表示图…

【深度学习笔记】9_9 语义分割和数据集

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 9.9 语义分割和数据集 在前几节讨论的目标检测问题中&#xff0c;我们一直使用方形边界框来标注和预测图像中的目标。本节将探讨语义分…

深度学习基础知识之Atrous卷积(空洞卷积)

太久不看代码确实生疏了&#xff0c;盯着一堆不同的dilation&#xff0c;不知道有什么作用&#xff0c;论文中说是Atrous卷积&#xff0c;原来就是空洞卷积的意思。 Dilated/Atrous Convolution 空洞卷积&#xff08;膨胀卷积/扩张卷积&#xff09; 空洞卷积是一种不增加参数量…

Web 服务器-Tomcat

文章目录 Web服务器一、Tomcat简介二、基本使用三、在IDEA中创建Maven Web项目四、在IDEA中使用Tomcat Web服务器 一、Tomcat简介 二、基本使用 三、在IDEA中创建Maven Web项目 四、在IDEA中使用Tomcat

外包干了9天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2018年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

【C#】.net core 6.0 使用第三方日志插件Log4net,日志输出到控制台或者文本文档

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

关于原型的一些总结

猛然发现太久没去复习了&#xff0c;于是复习了一些知识&#xff0c;顺便冒个泡。本次主要总结的知识点关于原型&#xff0c;再文章后半部分有原型相关的题&#xff0c;感兴趣的可直接观看。 一、原型 1.什么是原型 简单理解&#xff0c;原型就是一个对象&#xff0c;通过原…

Linux基础 想学好Linux请看这篇文章 Linux操作指令大全

当涉及学习 Linux 时&#xff0c;了解其基本原理和核心概念是至关重要的。Linux 是一种开源操作系统&#xff0c;广泛应用于服务器、嵌入式系统以及个人计算机中。它的灵活性、稳定性和安全性使得它成为许多 IT 专业人士和开发人员的首选。 第一步&#xff1a;了解基本概念和特…

CC连接过程

1、CC线连接过程 DFP和UFP会实时监控CC1和CC2引脚的电压&#xff0c;来评估DFP和UFP是否都已经在位。同时DFP可以根据电压确定自己所能提供的电流的大小 2、连接过程 Source端使用一个MOS管去控制Vbus&#xff0c;初始状态下&#xff0c;FET为关闭状态&#xff0c;Vbus不通。S…

苍穹外卖问题记录(持续更新)

Day01_3.2.4前后端联调 1. 前端无法登录 &#xff08;1&#xff09;确保nginx服务器已经启动 &#xff08;2&#xff09;查看自己数据库的用户名和密码是否和老师的一样&#xff0c;不一样的话需要在application-dev.yml文件中把老师的用户名密码修改成自己的 老师的用户名…

单⽬相机成像过程_看这一篇就够了

单⽬相机成像过程:看这一篇就够了 附赠宝贵的全套自动驾驶学习资料&#xff1a; 资料链接 附赠宝贵的全套自动驾驶学习资料&#xff1a; 资料链接

开发反应式API

开发反应式API 开发反应式API1 使用SpringWebFlux1.1 Spring WebFlux 简介1.2 编写反应式控制器 2 定义函数式请求处理器3 测试反应式控制器3.1 测试 GET 请求3.2 测试 POST 请求3.3 使用实时服务器进行测试 4 反应式消费RESTAPI4.1 获取资源4.2 发送资源4.3 删除资源4.4 处理错…

107. 如何使用Docker以及Docker Compose部署Go Web应用

文章目录 一、为什么需要Docker&#xff1f;二、Docker部署示例1. 准备代码2. 创建Docker镜像3. 编写Dockerfile4. Dockerfile解析5. 构建镜像6. 通过镜像创建容器运行 三、分阶段构建示例四、附带其他文件的部署示例五、关联其他容器六、Docker Compose模式七、总结 本文将介绍…

49、东北大学、阿尔伯塔大学:MVS-GCN多视角脑区、具有先验脑结构学习的图模型[GCN六元理论识别所有EEG!]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2022年1.19日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑功能网络(FBN)已被用于神经系统疾病的分类&#xff0c;如自…

力扣题目训练(21)

2024年2月14日力扣题目训练 2024年2月14日力扣题目训练605. 种花问题617. 合并二叉树628. 三个数的最大乘积289. 生命游戏299. 猜数字游戏149. 直线上最多的点数 2024年2月14日力扣题目训练 2024年2月14日第二十一天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;…