CString.Format 的怪問題

我的 ThermalTest 程式,在顯示 "已經過" 的時間時,會出現奇怪的問題,似乎所有的參數都往後移一位,原本顯示 "秒" 的變成 "分"、顯示 "分" 的變成 "小時",依此類推。

// TODO: Add your message handler code here and/or call default
 CTime tNow = CTime::GetCurrentTime();

 CString str, strResult, strFile;

 // 經過時間
 CTimeSpan tPeriod = tNow - m_tStart;

 strResult.Format("%04d/%02d/%02d %02d:%02d:%02d", tNow.GetYear(), tNow.GetMonth(), tNow.GetDay(), tNow.GetHour(), tNow.GetMinute(), tNow.GetSecond());
 strFile = strResult;

 str.Format(" 已經過 %d 天 %02d:%02d:%02d\n", tPeriod.GetDays(), tPeriod.GetHours(), tPeriod.GetMinutes(), tPeriod.GetSeconds());
 strResult += str;

後來發現是 GetDays( ) 造成的,它的傳回值是 LONGLONG,但是 Format 只用 %d,因此造成參數溢位往後推擠,只要將 %d 改成 %lld 就可以了。

參考:Size and Distance Specification

另發現我當時有另一種解法,但不知為何程式沒有 Release

str = tPeriod.Format(_T(" 已經過 %D 天 %H:%M:%S\n"));

參考:CTimeSpan::Format

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯