gpt4 book ai didi

c - 如何将 char* 地址发送到函数,以便以十六进制打印

转载 作者:行者123 更新时间:2023-11-30 18:44:39 26 4
gpt4 key购买 nike

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

最佳答案

the compiler doesn't let me convert it to unsigned int.

i manage to make it work , i use a convertion, i send it with (unsigned int)temp and it worked

显式转换为整数类型是良好的第一步。 “编译器不允许我转换”意味着您的编译器已启用 - 很好。

C 提供1 (u)intptr_t作为足以转换 void * 的整数类型到一个整数并返回到一个等效的指针。 unsigned可能太窄而丢失有值(value)的信息。

避免在此代码中使用带符号类型。
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 这些是可选类型。很少有现代编译器不提供这些类型。

关于c - 如何将 char* 地址发送到函数,以便以十六进制打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57288800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com