字母的大小写转换(tolower、toupper、transform)
1. tolower()、toupper()函数
(这个在之前的一篇文章 “字符串中需要掌握的函数总结(1)”中有较为详细的介绍。)
【代码如下】
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s="bdioICvnHns",s1,s2;
for(int i=0;i<s.length();i++)
{
s1.push_back(tolower(s[i]));
s2.push_back(toupper(s[i]));
}
cout<<"tolower转变后:"<<s1<<endl;
cout<<"toupper转变后:"<<s2<<endl;
}
【运行结果】
2.transform()函数(头文件是 <algorithm>)
上面的 toupper、tolower只能一次转换单个字母,要转化整个字符串,则需遍历,若不想遍历,那么可以选择用 transform。
【代码如下】
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s="bdioICvnHns";
transform(s.begin(),s.end(),s.begin(),::tolower);
cout<<"string字符串-tolower转变后:"<<s<<endl;
transform(s.begin(),s.end(),s.begin(),::toupper);
cout<<"string字符串-toupper转变后:"<<s<<endl;
char ch[]={'m','L','k','t','P','h','F'};
transform(ch,ch+7,ch,::tolower);
cout<<"char字符串-tolower转变后:"<<ch<<endl;
transform(ch,ch+7,ch,::toupper);
cout<<"char字符串-toupper转变后:"<<ch<<endl;
}
【运行结果】
【说明】
transform(s.begin(),s.end(),s.begin(),::toupper) 中的 “: :” 是作用域解析运算符,它用于指定一个特定的命名空间或类中的成员。当你在代码中使用 using namespace std; 时,你告诉编译器在当前的作用域中考虑 std 命名空间中的名字。然而,标准库中的某些函数,比如 toupper,并不在 std 命名空间中,而是在全局命名空间中。
当你调用 transform(s.begin(), s.end(), s.begin(), ::toupper); 时,要使用 : :toupper 来明确指出 toupper 函数是在全局命名空间中,而不是在 std 命名空间中。这是因为 transform 函数需要知道具体使用哪个 toupper 函数,而全局命名空间中的 toupper 是你想要的。
如果你省略了 ::,编译器会尝试在当前作用域(包括由于 using namespace std; 而引入的 std 命名空间)中查找toupper。由于 std 命名空间中没有toupper,编译器会报错,因为它找不到这个函数。所以,:: 在这里的作用是确保编译器在全局命名空间中查找 toupper 函数,而不是在 std 命名空间中。这是必要的,因为 toupper 函数实际上是在全局命名空间中定义的。