我有以下代码,但我不确定%0x%x
在以下代码中的含义是什么?
sprintf(buf, "pixel : %0x%x \n", gpbImageData[100]);
OutputDebugString(buf);
gpbImageData[100]
指向内存中的图像数据。
答案 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”是一个指针数组。