2012-09-25 100 views
4

我有以下代碼:的sprintf()亂碼輸出

char buf[255]; 
int ID = 0; 
double val = 1.234; 
sprintf(buf, "%[email protected]%.3lf", ID, val); 
printf("%s", buf); 

printf()正確打印ID值,但val值只是一些垃圾。你知道是什麼原因導致這個問題?我在Win7 32位上使用MSVC 9。上述代碼在64位機器上正常工作甚至更加陌生。

在此先感謝您的幫助。

+0

在mac上使用gcc 4.2.1。 – Geoffroy

+3

使用'%.3f'而不是'%.3lf'是否改變了什麼? – vinnydiehl

+0

使用%f不能解決此問題。 – gchlebus

回答

2

此評論之後:

是的,還有一些額外的代碼。這段代碼被編譯到一個DLL庫中,實際上我有三個地方,我稱之爲我的問題中發佈的代碼,並且只在輸出垃圾中的一個地方,如上所述。

這可能是由於代碼中其他地方的某些問題。你可能會破壞堆棧/堆,並無意中覆蓋你的變量。用內存檢查器(valgrind(unix),CMemLeak(everything))檢查你的代碼

+0

嘗試使用CMemLeak檢查內存泄漏時,我收到了鏈接時錯誤。我已經在循環中運行了超過100000次的代碼,並且使用Windows任務管理器監視內存使用情況,似乎內存泄漏並非如此。現在我通過用boost :: format替換sprintf來解決問題。 – gchlebus

+0

我沒有說你在哪裏泄漏內存,你正在破壞堆棧/堆。隨着您的快速解決,問題可能會在稍後再次出現。你得到了什麼鏈接錯誤? – Minion91

+0

我得到LNK2019爲未解決的XWBReportFinal,我調用的方法調用'sprintf'的類的析構函數。 – gchlebus