2011-11-23 154 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這個字符串。