我有一个练习要做,我需要打印字符串地址的开头,以便说[0]
位置。
我使用的函数将以正确的格式编写00000hexahexa
,但我不知道如何将地址发送到该功能,因此它变成了int。
这是我的代码,主要功能在底部, size
是字符串中的字符数。
我尝试将地址发送到函数printaddr
,但编译器不允许我将其转换为unsigned int
。
void convhexa(int nbr)
{
char *hexa;
hexa = "0123456789abcdef";
if (nbr > 15)
{
convhexa(nbr / 16);
convhexa(nbr % 16);
}
else
write(1, &hexa[nbr], 1);
}
void printaddr(unsigned int addr)
{
int count;
unsigned int nbr;
nbr = addr;
count = 0;
while (nbr > 0)
{
nbr /= 16;
count++;
}
while (count++ < 15)
write(1, "0", 1);
convhexa(addr);
write(1, ": ", 2);
}
void *ft_print_memory(void *addr, unsigned int size)
{
char *temp;
temp = addr;
while (size > 0)
{
printaddr(temp);
temp += 16;
size -= 16;
}
return (addr);
}
编译器不允许我将其转换为
unsigned int
。我设法使它起作用,使用转换,我将其发送给
(unsigned int)temp
,并且它起作用
明确转换为整数类型是一个很好的第一步。"编译器不允许我转换"意味着您的编译器启用了 - 好。
C提供 1 (u)intptr_t
作为足以将void *
转换为整数并返回等效指针的整数类型。unsigned
可能太狭窄了,丢失了有价值的信息。
避免在此代码中签名类型。
write(1, &hexa[nbr], 1);
当nbr < 0
。
// void convhexa(int nbr)
// void printaddr(unsigned int addr)
#include <stdint.h>
void convhexa(uintptr_t nbr)
void printaddr(uintptr_t addr)
以下是不稳定的代码。当size
不是16的倍数时,这是一个无限环路。
unsigned int size
...
while (size > 0) {
printaddr(temp);
temp += 16;
size -= 16;
}
建议while (size >= 16)
1 这些是可选类型。很少有现代编译器不提供这些类型。
要打印地址,只需在printf(3)
例程中使用%p
格式即可。它与指针一起使用,并在十六进制中打印值。
ssize_t print_string_with_offset(const char* s)
{
int c;
ssize_t res =
printf("%08p[", s); /* the address (w. 8 hex digits) */
/* now print the chars of the string up (but not including) the final ' ' */
while ((c = *s++) != 0)
res += printf(" %02x", c & 0xff); /* each char with 2 hex digits */
res += printf("]n");
return res;
}
如果您想要更详细的十六进制打印常规,可以使用版本写作来说明如何在此处打印十六进制缓冲区。