目录
前言
这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!这章的内容较为简单,那么事不宜迟,我们马上开始吧!
一、islower/isupper判断大小写函数
1.基本介绍
islower和isupper是C++标准库中的字符分类函数,用于检查一个字符是否为小写字母或大写字母。islower和isupper函数需包含头文件<cctype.h>,也可用万能头文件包含。函数的返回值类型为bool。
对于小写字母来说,其范围:'a'-'z'
对于大写字母来说,其范围:'A'-'Z'
以下是一段代码示例:
char c1 = 'a';
char c2 = 'A';
if(islower(c1))
{
cout << "is lowercase letter" << endl;
}
else
{
cout << "not a lowercase letter" << endl;
}
if(isupper(c2))
{
cout << "is uppercase letter" << endl;
}
else
{
cout << "not a uppercase letter" << endl;
}
二、tolower和toupper转换大小写函数
1.基本介绍
tolower(char c)可以将c转换为小写字母,如果c是小写字母则不进行操作。toupper函数同理。
下面是一段代码示例:
char c1 = 'A';
char c2 = 'b';
char lowercasec1 = tolower(c1);
cout << c1 << endl;
char uppercasec2 = toupper(c2);
cout << c2 << endl;
三、ASCII码
1.大小写转换的原理
ASCII码表实质上建立了字符与数字之间的映射。我们知道,在计算机底层的代码中,任何数据类型都是以0和1来表示的。二进制的基础决定了字符型与整型的同一性。那它们两者的区别是什么?
一个自然是存储空间不同。对于char类型,其只占用1byte。而整型int需要占用4byte。其二,计算机解析char类型时比处理整型多了一个映射表。这里学过单片机串口通信的同学可能感触会比较深。我们使用单片机收发数据是发出和接收的一般都是HEX数据。而当我们需要得到文本数据时,我们就需要接收方根据对应的编码表对HEX数据进行文本解析。由此,我们可以实现一些有意思的操作。
2.通过加减运算实现大小写转换
以下是代码示例:
char c1 = 'A';
char c2;
if(c1 >= 'A'&&c1 <= 'Z')
{
c2 = c1 + 32; //对应大小写字母的ASCII编码值相差32
cout << c2 << endl;
}
else if(c1 >= 'a'&&c1 <= 'z')
{
c2 = c1 - 32; //对应大小写字母的ASCII编码值相差32
cout << c2 << endl;
}
else
{
cout << "invalid character!!" << endl;
}
ASCII码表中,大写字母的编码范围是65('A')-90('Z'),小写字母的范围是97('a')-122('z')
3.将int“转换”为char输出
这个问题是我的舍友提出的,我觉得很有意思,想放在这与大家分享。
他输入一个int类型的整数,想输出字符型的数字在屏幕上。我和其他人一开始的想法是进行强制类型转换,但发现并不是这样的。原因在前面我也提到了。有的人或许或有疑问:直接输出不就行了吗,哪有这么多事情。我承认你说的很对,但是我就是想试试。
那么我的思路是这样的:我们将int类型的整数中的每一位都取出来,之后将其变为字符形式打印出来。下面是我的代码(这里用的是我单片机项目里的代码,大家将类型修改一下即可):
//幂函数
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while (Y --)
{
Result *= X;
}
return Result;
}
//对于一个数,取某一位就是数字/10^x%10(/10^x是将右边去掉,%10是将左边去掉)
//若取的是百位,则x=2
//发送字符形式的数字(函数作用)
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
uint8_t i;
for (i = 0; i < Length; i ++)
{
//将参数从高位到低位依次发送
//'0'的ASCII码对应值是0x30,这里是作为偏移从而以字符的形式输出数字
Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
}
}
总结
我也从没想过有关大小写的库函数还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!