为什么 std::大写不适用于字符串?

Why std::uppercase doesn't work with strings?

本文关键字:适用于 字符串 不适用 std 为什么      更新时间:2023-10-16

我已经使用了一段时间,却没有完全了解它们的工作方式。

此代码:

std::cout << std::hex << std::showbase;
std::cout << std::uppercase << 77 << 'n';
std::cout << std::nouppercase << 77 << 'n';

或其他方式:

std::cout << std::hex;
std::cout << std::setiosflags(std::ios::showbase | std::ios::uppercase) << 77 << 'n';
std::cout << std::nouppercase << 77 << 'n';

两者都输出以下内容:

0X4D // 'X' and 'D' uppercase
0x4d // 'x' and 'd' lowercase

但是,以下代码几行都无法将字符串的" ABCD"转换为大写。为什么?

std::cout << std::uppercase << "abcd" << 'n';
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << 'n';

另一个问题是,为什么showbaseuppercase必须在std::setiosflags()内使用std::ios::,并且仅在该功能外部使用std::

finaly,为什么在std::setiosflags()中无法接受std::hex

谢谢

阅读std::uppercase的文档。

启用在浮点和十六进制整数输出中使用大写字符。

std::ios_base::hexstd::setiosflags接受。

中有一个示例。

这是std::uppercase的示例:

#include <iostream>
int main()
{
    std::cout << std::hex << std::showbase
              << "0x2a with uppercase: " << std::uppercase << 0x2a << 'n'
              << "0x2a with nouppercase: " << std::nouppercase << 0x2a << 'n'
              << "1e-10 with uppercase: " << std::uppercase << 1e-10 << 'n'
              << "1e-10 with nouppercase: " << std::nouppercase << 1e-10 << 'n';
}

这是std::setiosflags的示例:

#include <iostream>
#include <iomanip>
int main()
{
    std::cout <<  std::resetiosflags(std::ios_base::dec) 
              <<  std::setiosflags(  std::ios_base::hex
                                   | std::ios_base::uppercase
                                   | std::ios_base::showbase) << 42 << 'n';
}

定义:

std::hex定义为std::ios_base& hex( std::ios_base& str );

std::ios_base::hex定义为static constexpr fmtflags hex = /*...*/;

std::uppercase仅影响转换为十六进制的结果。

std::hex是一个操纵对象,而setiosflags期望通过组合单个位形成的整数。或者,更确切地说,一种以这种方式行为的类型。而不是std::hex(类型错误),您可以使用std::ios_base::hex

我想加2美分。我在代码开头写这2行,以使生活更轻松:

const long base = std::ios::showbase;
const long upper = std::ios::uppercase;

随后使用常数而不是乏味的代码。