1.利用ASCII表
原理:根据ASCII表中对应大小写字母相差32
变大写
string Toupper(string s)
{
for(int i=0;i<s.length();i++){
if(s[i]>='a' && s[i]<='z'){
s[i]=char(s[i]-32);
}
}
return s;
}
变小写
string Tolower(string s)
{
for(int i=0;i<s.length();i++){
if(s[i]>='A' && s[i]<='Z'){
s[i]=char(s[i]+32);
}
}
return s;
}
2.利用大小写转换函数
利用toupper()和tolower()
//变大写
string Toupper(string s)
{
for(int i=0;i<s.length();i++){
s[i]=(char)toupper(s[i]);
}
return s;
}
//变小写
string Tolower(string s)
{
for(int i=0;i<s.length();i++){
s[i]=(char)tolower(s[i]);
}
return s;
}
3.位运算
字符 | 十进制 | 二进制 | 字符 | 十进制 | 二进制 |
---|---|---|---|---|---|
A | 65 | 0100 0001 | a | 97 | 0110 0001 |
B | 66 | 0100 0010 | b | 98 | 0110 0010 |
C | 67 | 0100 0011 | c | 99 | 0110 0011 |
… | … | … | … | … | … |
Z | 90 | 0101 1010 | z | 122 | 0111 1010 |
观察大小写字符ASCII码相差32=2^5,二进制表示为0010 0000,而大小写字母二进制的区别为第五位是1还是为0——大写为0,小写为1.
据此,得出:
若进行大小写交换,则与0010 0000按位异或,即 ch ^ 32
若转化为小写字母,则与0010 0000按位或,即 ch | 32
若转化为大写字母,则与1101 1111按位与,即 ch & -33
4使用STL中模板函数transform
函数原型
template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op );
first1, last1
指出要进行元素变换的第一个迭代器区间 [first1,last1)
result
指出变换后的结果存放的迭代器区间的首个元素的迭代器位置
op
用一元函数对象op作为参数,执行其后返回一个结果值。它可以是一个函数或对象内的类重载operator()
transform(s.begin(),s.end(),s.begin(),::toupper);//变大写
transform(s.begin(),s.end(),s.begin(),::tolower);//变小写
例
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string s="aBcDeFgHiJkLmN";
int main()
{
transform(s.begin(),s.end(),s.begin(),::toupper);
cout<<s<<endl;
transform(s.begin(),s.end(),s.begin(),::tolower);
cout<<s<<endl;
return 0;
}
输出结果:
ABCDEFGHIJKLMN
abcdefghijklmn