2011-11-23 149 views
1

我有一个要求,其中的一部分需要从十进制转换为十六进制。十进制到十六进制转换:sprintf的问题?

我更喜欢下面的方法做如下那件事:

sprintf(mcc,"%x",n); 

n这里将是一个整数。 但我的同事说这不是一个好的方法来做到这一点。 相反,他说要使用函数手动转换小数, 但我没有得到一个很好的解释,为什么不使用sprintf。

上述方法有什么问题吗?

我应该去手动将十进制数转换为十六进制的函数吗?

回答

3

只要确保mcc所指向的缓冲区足够大以便生成字符串,我就没有问题了。

1

sprintf的问题是很难保证你的缓冲区足够大。改为使用snprintf

在这种情况下,可能的最大输出长度很小,很容易计算,但并不总是这么简单,我的猜测是这就是为什么你的朋友告诉你不要使用sprintf

+2

这通常是正确的,但在这里Rahul正在将数字转换为十六进制,使mcc的大小变得更容易。 – Teudimundo

+0

在这种情况下,如果**知道'n'的范围,那么这不是很难。例如:对于0 <= n <= 65535,“最大”十六进制是FFFF,因此,缓冲区大小应为5。 – Andre

+0

是的,在这种情况下,输出应该足够小,但是通常应该首选长度检查版本,我的猜测是这就是他的朋友反对'sprintf'的原因。 – Kevin

1

如果您使用的是支持GNU扩展的机器,那么您也可以使用asprintf。这将分配堆内存,将字符串存储在其中,然后给你一个指向这个的指针。只要确保你完成了free这个字符串。