在C++开发中,字符大小写转换是字符处理场景下的高频需求,比如用户输入校验、字符串规范化、数据匹配等场景都会用到。标准库提供了toupper和tolower两个函数专门处理这类转换,下面详细介绍它们的使用方法。

toupper与tolower函数基本介绍
这两个函数都定义在<cctype>头文件中,属于C标准库的字符处理函数,在C++中也可以直接使用。它们的核心作用是对单个字符进行大小写转换:
- toupper函数:接收一个字符参数,如果该字符是小写字母,就返回对应的大写字母;如果不是小写字母,直接返回原字符。
- tolower函数:接收一个字符参数,如果该字符是大写字母,就返回对应的小写字母;如果不是大写字母,直接返回原字符。
需要注意的是,这两个函数的参数和返回值类型都是int,主要是为了兼容EOF(文件结束符)的场景,实际使用时传入char类型字符即可,返回值可以强转为char类型。
单字符大小写转换示例
先来看单个字符的转换用法,这是最基础的使用场景:
#include <iostream>
#include <cctype> // 引入toupper和tolower函数所在的头文件
int main() {
char lower_char = 'a';
char upper_char = 'B';
// 小写转大写
char result1 = static_cast<char>(toupper(lower_char));
// 大写转小写
char result2 = static_cast<char>(tolower(upper_char));
// 非字母字符转换,返回原字符
char result3 = static_cast<char>(toupper('1'));
std::cout << "小写a转大写结果:" << result1 << std::endl;
std::cout << "大写B转小写结果:" << result2 << std::endl;
std::cout << "数字1转换结果:" << result3 << std::endl;
return 0;
}
上述代码的输出结果为:
小写a转大写结果:A 大写B转小写结果:b 数字1转换结果:1
字符串整体大小写转换示例
实际开发中更多需要对整个字符串进行大小写转换,这时可以结合循环遍历字符串的每个字符,逐个调用转换函数即可。
字符串转全大写
#include <iostream>
#include <cctype>
#include <string>
int main() {
std::string str = "Hello World! 123";
// 遍历字符串每个字符,逐个转为大写
for (size_t i = 0; i < str.size(); ++i) {
str[i] = static_cast<char>(toupper(str[i]));
}
std::cout << "转全大写结果:" << str << std::endl;
return 0;
}
字符串转全小写
#include <iostream>
#include <cctype>
#include <string>
int main() {
std::string str = "Hello World! 123";
// 遍历字符串每个字符,逐个转为小写
for (size_t i = 0; i < str.size(); ++i) {
str[i] = static_cast<char>(tolower(str[i]));
}
std::cout << "转全小写结果:" << str << std::endl;
return 0;
}
上述两段代码的输出结果分别为:
转全大写结果:HELLO WORLD! 123 转全小写结果:hello world! 123
使用注意事项
- 必须引入
<cctype>头文件,否则编译器会提示函数未定义的错误。 - 函数的参数类型是
int,如果传入的字符是负数且不是EOF,可能会触发未定义行为,所以尽量保证传入的是有效的字符或者EOF。 - 这两个函数只对ASCII编码下的英文字母有效,如果处理其他编码的字符(比如中文、UTF-8编码的其他语言字符),无法得到正确的转换结果,这类场景需要使用对应的编码转换库。
- 转换后的返回值是
int类型,直接赋值给char类型变量时建议用static_cast<char>做显式转换,避免编译器警告。