Как смоделировать формат% p в printf при использовании std :: cout? - PullRequest
18 голосов
/ 14 апреля 2011
unsigned char *teta = ....;
...
printf("data at %p\n", teta); // prints 0xXXXXXXXX

Как можно распечатать переменный адрес, используя iostream s?Есть ли std:: ???такая функция, как std::hex для такого преобразования (адрес -> строка), поэтому std::cout << std::??? << teta << std::endl будет печатать этот адрес?

(нет sprintf, пожалуйста;))

Ответы [ 2 ]

27 голосов
/ 14 апреля 2011

Приведение к void*:

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

iostreams обычно предполагают, что у вас есть строка с любым указателем char*, но указатель void* - это просто адрес (упрощенный), поэтомуiostreams не может делать ничего, кроме преобразования этого адреса в строку, а не содержимого этого адреса.

1 голос
/ 14 апреля 2011

В зависимости от того, хотите ли вы использовать дополнительные параметры форматирования, которые предоставляет 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;
...