为什么 std::uppercase 不适用于字符串?
Why std::uppercase doesn't work with strings?
我使用操纵器已经有一段时间了,但还没有完全理解它们的工作原理。
此代码:
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
但是下面的none行代码可以将字符串"abcd"转换为大写。为什么?
std::cout << std::uppercase << "abcd" << '\n';
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << '\n';
另一个问题是为什么 showbase
和 uppercase
必须在 std::setiosflags()
内用 std::ios::
限定,而在该函数外只能用 std::
限定?
最后,为什么std::hex
里面不能接受std::setiosflags()
谢谢
std::uppercase
只影响十六进制的转换结果。
std::hex
是一个操纵器对象,而 setiosflags
需要一个通过组合各个位形成的整数。或者,更准确地说,是一种以这种方式行事的类型。您可以使用 std::ios_base::hex
.
而不是 std::hex
(这是错误的类型)
阅读 std::uppercase
的文档。
Enables the use of uppercase characters in floating-point and hexadecimal integer output.
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 = /*...*/;
我想加我的 2 美分。我在代码的开头写了这两行以使生活更轻松:
const long base = std::ios::showbase;
const long upper = std::ios::uppercase;
以后用常量代替繁琐的代码。
我使用操纵器已经有一段时间了,但还没有完全理解它们的工作原理。
此代码:
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
但是下面的none行代码可以将字符串"abcd"转换为大写。为什么?
std::cout << std::uppercase << "abcd" << '\n';
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << '\n';
另一个问题是为什么 showbase
和 uppercase
必须在 std::setiosflags()
内用 std::ios::
限定,而在该函数外只能用 std::
限定?
最后,为什么std::hex
里面不能接受std::setiosflags()
谢谢
std::uppercase
只影响十六进制的转换结果。
std::hex
是一个操纵器对象,而 setiosflags
需要一个通过组合各个位形成的整数。或者,更准确地说,是一种以这种方式行事的类型。您可以使用 std::ios_base::hex
.
std::hex
(这是错误的类型)
阅读 std::uppercase
的文档。
Enables the use of uppercase characters in floating-point and hexadecimal integer output.
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 = /*...*/;
我想加我的 2 美分。我在代码的开头写了这两行以使生活更轻松:
const long base = std::ios::showbase;
const long upper = std::ios::uppercase;
以后用常量代替繁琐的代码。