【问题标题】:How to simulate printf's %p format when using std::cout?使用std::cout时如何模拟printf的%p格式?
【发布时间】:2011-08-05 03:42:15
【问题描述】:
unsigned char *teta = ....;
...
printf("data at %p\n", teta); // prints 0xXXXXXXXX

如何使用iostreams 打印变量地址?有std::吗???像std::hex 这样的功能来做这种转换(地址-> 字符串),所以std::cout << std::??? << teta << std::endl 会打印那个地址?

(请不要使用 sprintf ;))

【问题讨论】:

    标签: c++ gcc iostream


    【解决方案1】:

    投射到void*:

    unsigned char* teta = ....;
    std::cout << "data at " << static_cast<void*>(teta) << "\n";
    

    iostreams 通常假设您有一个带有任何 char* 指针的字符串,但 void* 指针就是这样 - 一个地址(简化),因此 iostreams 除了将该地址转换为字符串之外,不能做任何事情,而不是那个地址的内容。

    【讨论】:

      【解决方案2】:

      根据您是否要使用 printf 提供的更多格式选项,您可以考虑使用sprintf

      通过它,您可以像使用 printf 一样格式化字符串,然后使用 std::cout 打印出来

      但是,这将涉及使用临时 char 数组,因此选择取决于。

      一个例子:

      unsigned char *teta = ....;
      ...
      char formatted[ 256 ]; //Caution with the length, there is risk of a buffer overflow
      sprintf( formatted, "data at %p\n", teta );
      std::cout << formatted;
      

      【讨论】:

      • 在这种情况下 (void *) 转换更好 - 没有临时数组适合单行调试 (log4cxx) 代码..
      • 您可以考虑使用snprintf 或(更好的)Boost.Format,而不是不安全的sprintf
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2012-03-12
      • 1970-01-01
      • 2016-12-29
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多