所以我正在编写自己的printf函数,所以我使用stdarg.h和系统调用write()。但我不知道如何将%p改为我的函数。 %X会产生相同的结果吗?
我有%x完成如此:
'x': x=va_arg(argp,argp, unsigned int);
char *temp = convert(x,16);
write(1, temp, lengthOFtemp);
break;
char *convert(unsigned int, int)
{
static char buf[33];
char *ptr;
ptr=&buf[sizeof(buff)-1];
*ptr='\0';
do
{
*--ptr="0123456789abcdef"[num%base];
num/=base;
}while(num!=0);
return(ptr);
}
答案 0 :(得分:0)
%p和%X之间的区别在于指针大小是特定于平台的 - 在64位平台上为8个字节,在32位平台上为4个字节。因此,您必须使用'unsigned long'变量来处理来自va_args的指针参数,而不是'unsigned int',它在某些64位平台上仍然是4个字节。
否则是的,非常类似于上面的%X代码。
答案 1 :(得分:0)
您可能想要使用
void * pv = va_arg(va, void*)
从可变参数列表中拉出指针。
要以这种方式安全地接收指针,可变参数函数的调用者(如上所示进行拉动)需要将指针传递给void *
。
然后像这样转换为整数:
#include <inttypes.h>
...
uintptr_t uipv = (uintptr_t) pv;
最后调用转换函数:
char buff[64] = {0};
char * pc = convert_uintptr(uipv, 16);
使用:
char * convert_uintptr(uintptr_t uipv, unsigned base);