【问题标题】:Decimal to hexadecimal conversion: issues with sprintf?十进制到十六进制的转换:sprintf 的问题?
【发布时间】:2011-11-23 05:50:18
【问题描述】:

我有个需求,部分需要十进制转十六进制。

我更喜欢以下方式来做这件事:

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

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

我使用的上述方法有问题吗?

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

【问题讨论】:

    标签: c printf


    【解决方案1】:

    只要确保mcc 指向的缓冲区对于生成的字符串足够大,我认为没有问题。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        sprintf 的问题在于很难保证你的缓冲区足够大。请改用snprintf

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

        【讨论】:

        • 这通常是正确的,但这里 Rahul 将数字转换为十六进制,拥有合适大小的 mcc 要容易得多。
        • 在这种情况下并不难如果你知道n的范围。例如:对于 0
        • 是的,在这种情况下输出应该足够小,但通常应该首选长度检查版本,我猜这就是他的朋友反对sprintf的原因。
        • 是的,我将收到的最大尺寸是 char[4].eg:f262.so 我将 mcc 作为 char mcc[4];我希望这能正常工作。
        • @RahulDravid 你实际上需要char[5],一个额外的来保存空终止符(\0 在末尾)。
        猜你喜欢
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 2011-11-27
        • 2018-07-26
        相关资源
        最近更新 更多