我有一个要求,其中的一部分需要从十进制转换为十六进制。十进制到十六进制转换:sprintf的问题?
我更喜欢下面的方法做如下那件事:
sprintf(mcc,"%x",n);
n
这里将是一个整数。 但我的同事说这不是一个好的方法来做到这一点。 相反,他说要使用函数手动转换小数, 但我没有得到一个很好的解释,为什么不使用sprintf。
上述方法有什么问题吗?
我应该去手动将十进制数转换为十六进制的函数吗?
我有一个要求,其中的一部分需要从十进制转换为十六进制。十进制到十六进制转换:sprintf的问题?
我更喜欢下面的方法做如下那件事:
sprintf(mcc,"%x",n);
n
这里将是一个整数。 但我的同事说这不是一个好的方法来做到这一点。 相反,他说要使用函数手动转换小数, 但我没有得到一个很好的解释,为什么不使用sprintf。
上述方法有什么问题吗?
我应该去手动将十进制数转换为十六进制的函数吗?
只要确保mcc
所指向的缓冲区足够大以便生成字符串,我就没有问题了。
sprintf
的问题是很难保证你的缓冲区足够大。改为使用snprintf
。
在这种情况下,可能的最大输出长度很小,很容易计算,但并不总是这么简单,我的猜测是这就是为什么你的朋友告诉你不要使用sprintf
。
如果您使用的是支持GNU扩展的机器,那么您也可以使用asprintf
。这将分配堆内存,将字符串存储在其中,然后给你一个指向这个的指针。只要确保你完成了free
这个字符串。
这通常是正确的,但在这里Rahul正在将数字转换为十六进制,使mcc的大小变得更容易。 – Teudimundo
在这种情况下,如果**知道'n'的范围,那么这不是很难。例如:对于0 <= n <= 65535,“最大”十六进制是FFFF,因此,缓冲区大小应为5。 – Andre
是的,在这种情况下,输出应该足够小,但是通常应该首选长度检查版本,我的猜测是这就是他的朋友反对'sprintf'的原因。 – Kevin