【发布时间】:2020-12-18 16:15:51
【问题描述】:
前言:我不能使用 C 库中的任何函数
我有这个功能:
char *to_base(long nbr, char *base)
{
static char buffer[50];
char *ptr;
int base_len;
ptr = &buffer[49];
*ptr = 0;
base_len = ft_strlen(base);
while (nbr != 0)
{
*--ptr = base[nbr % base_len];
nbr /= base_len;
}
return (ptr);
}
正如我们所见,这需要很长时间。在我的程序中,我有一个 unsigned long 必须将其转换为十六进制值。在这个函数中传递 unsigned long 是否不安全?如果是,我怎样才能使它工作?
编辑: 以下是我目前的使用方式:
unsigned long val;
char *hexa;
val = (unsigned long)va_arg(*list, void *);
hexa = to_base(val, "0123456789abcdef");
【问题讨论】:
-
问题是您的 function 不能安全地与 signed long 一起使用:D
-
只需使用
sprintf()。这至少是多线程安全的,您发布的功能是不是。哎呀,您发布的那个不安全,因为后续使用会消除以前使用的价值。 -
这个问题归结为“将无符号整数转换为有符号整数是否安全”(如果我们忽略不相关的问题)。答案可以在 C 标准 port70.net/~nsz/c/c11/n1570.html#6.3.1.3 中找到(否则,新类型是有符号的,并且值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号。)
-
对于它的价值,这个功能只是塞满了“什么??不!”时刻。如果目标是将数字转换为字符串,请使用现有的库函数。这个问题在几十年前就已经解决了,并且在标准库中。
-
继续阅读
snprintf,因为这段代码需要真正的对话和干预。%xl做你想做的,然后做一些。