%0x%x在C / C ++编程中意味着什么?

时间:2012-03-17 18:40:16

标签: c memory buffer

我有以下代码,但我不确定%0x%x在以下代码中的含义是什么?

sprintf(buf, "pixel : %0x%x \n", gpbImageData[100]);
OutputDebugString(buf);

gpbImageData[100]指向内存中的图像数据。

3 个答案:

答案 0 :(得分:12)

您的示例会导致未定义的行为。格式字符串将导致sprint期望两个int值:

%0x
%x

这两个意思完全相同 - 将值打印为十六进制数。但是,您显示的呼叫只传递一个参数。

您确定它没有说0x%x吗?如果没有,那么可能应该......更正常,并将传入的值打印为前缀为0x的十六进制数。

您显示的代码应该会发出警告。 clang给出:

example.c:5:15: warning: more '%' conversions than data arguments [-Wformat]
  printf("%0x%x\n", 125987);
             ~^
1 warning generated.

gcc说:

example.c: In function ‘main’:
example.c:5: warning: too few arguments for format
example.c:5: warning: too few arguments for format

两者都没有提供任何标志。

答案 1 :(得分:9)

你当然是指这种格式字符串"0x%x"

sprintf(buf, "pixel : 0x%x \n", gpbImageData[100]);

这会在0x中写入十六进制数时添加buf前缀。

请注意,您可以使用标记字符#实现相同的功能:

sprintf(buf, "pixel : %#x \n", gpbImageData[100]);

答案 2 :(得分:2)

正确的格式是“0x%x”,因为ouah和Carl Norum说。无论gpbImageData [100]内容(指针或数字)如何,%x都会将其值打印为十六进制数字。 0x只是一个文本。也许“gpbImageData”是一个指针数组。