为什么std :: uppercase不能用于字符串?

时间:2016-11-27 21:06:37

标签: c++ manipulators

我一直在使用操纵器一段时间而没有完全理解它们是如何工作的。

此代码:

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

但是,以下代码行中没有一行可以转换字符串&#34; abcd&#34;大写为什么呢?

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

另一个问题是,为什么showbaseuppercase必须在std::ios::std::setiosflags()限定,并且只有std::在该功能之外?

最后,为什么std::hex无法在std::setiosflags()内被接受

谢谢

3 个答案:

答案 0 :(得分:7)

阅读std::uppercase的文档。

  

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

std::ios_base::hex接受了

std::setiosflags docs中有一个示例。

以下是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 = /*...*/;

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我想加2美分。我在代码的开头编写了以下两行代码,以使生活更轻松:

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

然后使用常量而不是乏味的代码。