我有一個要求,其中的一部分需要從十進制轉換爲十六進制。十進制到十六進制轉換: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