字符转换功能 std::isupper() & std::islower() C++17
Character converting funtion std::isupper() & std::islower() C++17
我创建了一个简单的程序来检查用户输入的字母是大写还是小写,然后使用std::isupper()
和std::islower()
功能将小写转换为大写,将大写转换为小写。 在运行代码时,我以数字形式而不是预期的大写/小写等效形式获得字符转换。为什么?
#include <iostream>
int main()
{
char letter {};
std::cout << "Enter a letter:";
std::cin >> letter;
if (std::isupper(letter))
{
std::cout << "You entered an uppercase letter"
"n"
"the lowercase equivalent is:"
<< std::tolower(letter);
}
if (std::islower(letter))
{
std::cout << "You entered a lowercase letter"
"n"
"the uppercase equivalent is:"
<< std::toupper(letter);
}
return 0;
}
下面是一个输出示例:
Enter a letter:F
You entered an uppercase letter.
The lowercase equivalent is:102
Enter a letter:f
You entered a lowercase letter.
The uppercase equivalent is:70
std::tolower
和std::toupper
返回int
,而不是char
(由于它源自 C 的遗留版本,因此选择int
有一定的要求,请参阅脚注(。
您可以将其转换回 char 以获得预期的结果:
static_cast<char>(std::tolower(letter));
或者,您可以在之前将结果保存在char
变量中(如果您需要在其他地方转换后者(:
letter = std::tolower(letter);
std::cout << letter;
注意:正如 Peter 在评论中注意到的那样,std::tolower
和std::toupper
有一些要求,要求使用大于实际需要的类型。引用如下:
它们也被指定为能够接受和返回
EOF
- 一个不能表示为 char 但可以表示为 int 的值。 C++ iostreams(当然没有来自 C 的遗留,是模板化std::basic_istream
的特化(有一个get()
函数,没有从流中读取字符的参数, 并返回大于正在读取的字符类型的整数类型。它是能够从文件中读取单个字符并处理错误条件的机制的一部分。
1. 选项
您可以使用标头中的std::tolower
和std::toupper
<locale>
返回您希望它们返回的类型。
看看例子:
char c {'T'};
std::cout << std::tolower(c, std::locale()) << std::endl; // output: t
和
char c {'t'};
std::cout << std::toupper(c, std::locale()) << std::endl; // output: T
查看实时示例
2. 选项
您可以使用标头中的std::tolower
和std::toupper
<cctype>
返回需要强制转换为char
的int
。
以下是示例:
char c {'T'};
std::cout << static_cast<char>(std::tolower(c)) << std::endl; // output: t
和
char c {'t'};
std::cout << static_cast<char>(std::toupper(c)) << std::endl; // output: T
查看实时示例
您还可以创建自己的方便的帮助程序函数:
char toupper(char c) {
return static_cast<char>(std::toupper(static_cast<unsigned char>(c)));
}
char tolower(char c) {
return static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
}
你可以像这样使用:
char c1 {'T'};
char c2 {'t'};
std::cout << tolower(c1) << std::endl; // output: t
std::cout << toupper(c2) << std::endl; // output: T
if(std::isupper(letter))
{
std::cout<<"You entered an uppercase letter"<<"n"
"the lowercase equivalent is:" << (char)std::tolower(letter);
}
if (std::islower(letter))
{
std::cout<<"You entered a lowercase letter"<<"n"
"the uppercase equivalent is:" << (char)std::toupper(letter);
}
return 0;
}
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么 C++17 中没有 std::construct_at?
- 字符转换功能 std::isupper() & std::islower() C++17
- C++17:使用 std::optional 来评估枚举是否包含值
- 在 Eclipse 上启用 C++17 以使用 'std::byte'
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- 如何在 C++17 中检索 std::filesystem::file_time_type 的时钟类型
- 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 为什么 'std::unary_function' 仍然在 c++17 中编译?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- c++17通过生成预先声明的类型列表的笛卡尔乘积来生成std::变体
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- std::filesystem::directory_迭代器链接器问题(C++17)
- 在使用 -std=c++17 编译时在 GCC 中复活 std::auto_ptr
- 如何使用 CMake 在 VS2017 中启用 /std:c++17
- 致命错误:在 -std=c++17 的 clang 6.0 中找不到'charconv'文件
- clang-6 和 -std=c++17 -- 不能调用 bind(2)
- 请求C 17的编译器通过使用-STD 17标志在-STD = C 17时,将启用STD ::变体的支持