如何将字符*地址发送到一个函数,以便在Hexa中打印



我有一个练习要做,我需要打印字符串地址的开头,以便说[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;
}

如果您想要更详细的十六进制打印常规,可以使用版本写作来说明如何在此处打印十六进制缓冲区。

最新更新