是否有一种C++方式使用iostream格式化地址和指针?

Alb*_*ers 4 c++ iostream

我有类似的东西

unsigned x = 16;
unsigned* p = &x;

std::cout << std::hex << std::setw(16) << std::setfill('0') << x << std::endl;
std::cout << std::hex << std::setw(16) << std::setfill('0') << p << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

0000000000000010
000x7fffc35ba784
Run Code Online (Sandbox Code Playgroud)

ostream :: operator <<为此重载了吗?我可以用C正确地写这个,但我想知道是否有一种正确的方法来使用iostream.

Mat*_*son 7

使用 internal这样:

#include <iostream>
#include <iomanip>

int main()
{
    unsigned x = 16;
    unsigned* p = &x;

    std::cout << std::hex << std::setw(16) << std::setfill('0') << x << std::endl;
    std::cout << std::hex << std::setw(16) << std::setfill('0') << p << std::endl;
    std::cout << std::internal << std::hex << std::setw(16) << std::setfill('0') << p << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这给出了:

0000000000000010
000x7fffd123c1a4
0x007fffd123c1a4
Run Code Online (Sandbox Code Playgroud)

  • 宽度不正确。使用“setw(sizeof(p)*2+2)”来代替前导“0x”。 (2认同)
  • 我看到这样的解决方案,有时我想也许 `sprintf` 还不错:) (2认同)
  • @Albert Streams 在 C++ 中是一个糟糕的抽象。如果您想要类型安全和(半)可读代码,您可能需要考虑使用 [Boost Format 库](http://www.boost.org/doc/libs/1_54_0/libs/format/)。 (2认同)
  • 请注意,我的答案并不是试图宣传/建议`stream`是一个很好的解决方案.只是想回答问题的实际问题.我经常建议替代品等.对于很多东西,流实际上相当容易使用(并且肯定比`printf\scanf`更安全类型). (2认同)