字符转换功能 std::isupper() & std::islower() C++17

Character converting funtion std::isupper() & std::islower() C++17

本文关键字:std C++17 islower isupper 转换 功能 字符      更新时间:2023-10-16

我创建了一个简单的程序来检查用户输入的字母是大写还是小写,然后使用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::tolowerstd::toupper返回int,而不是char(由于它源自 C 的遗留版本,因此选择int有一定的要求,请参阅脚注(。

您可以将其转换回 char 以获得预期的结果:

static_cast<char>(std::tolower(letter));

或者,您可以在之前将结果保存在char变量中(如果您需要在其他地方转换后者(:

letter = std::tolower(letter);
std::cout << letter;

注意:正如 Peter 在评论中注意到的那样,std::tolowerstd::toupper有一些要求,要求使用大于实际需要的类型。引用如下:

它们也被指定为能够接受和返回EOF- 一个不能表示为 char 但可以表示为 int 的值。 C++ iostreams(当然没有来自 C 的遗留,是模板化std::basic_istream的特化(有一个get()函数,没有从流中读取字符的参数, 并返回大于正在读取的字符类型的整数类型。它是能够从文件中读取单个字符并处理错误条件的机制的一部分。

1. 选项

您可以使用标头中的std::tolowerstd::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::tolowerstd::toupper<cctype>返回需要强制转换为charint

以下是示例:

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;
}