2013-07-31 78 views
2

我試圖爲我的程序創建時間戳。在我姐姐的Mac(使用的Xcode 4.2)這個代碼工作完全正常:本地時間和asctime是不安全的,但安全功能沒有相同的參數

struct tm * timeInfo; 
time_t rawtime; 
time (&rawtime); 
timeInfo = localtime (&rawtime); 
string timestamp(asctime(timeInfo)); 

然而,在我的電腦上運行Visual Studio 2012,我得到了本地時間和asctime的錯誤,告訴我,他們是不安全的功能,它建議使用localtime_s和asctime_s。但是,功能參數不同。我已盡力研究功能,但我無法實現它的功能。

任何幫助得到它的工作將不勝感激。

編輯:

struct tm * timeInfo; 
time_t rawtime; 
time (&rawtime); 
timeInfo = localtime_s (&rawtime); 
string timestamp(asctime_s(timeInfo)); 
+0

在http://msdn.microsoft.com/en-us/library/a442x3ye(v=vs.80).aspx –

+2

的底部有一個完整的示例請注意,這些函數不是*標準* C++,並且將不適用於您的MacOS版本。 –

+0

Linux有localtime_r()(注意r不是s),它是相似的,但有兩個參數相反。 –

回答

5

原因這些功能有不同的parmaters是缺乏安全性是由只有一個單一的參數引起的。特別是,asctime()使用單個緩衝區來返回時間。所以,如果你這樣做:

char *s1 = asctime((time_t)0); // 1-Jan-1970 00:00:00 or something like that. 
time_t t = time(); 
char *s2 = asctime(t); 
cout << "1970: " << s1 << " now:" << s2 << endl; 

然後,你將不會看到兩個不同的時間打印出來,但當前時間兩次印刷,既s1s2指向相同的字符串。

這同樣適用於localtime,它返回一個指向struct tm - 但它總是相同的struct tm,所以你如果你這樣做:

struct tm* t1 = localtime(0); 
struct tm* t2 = localtime(time()); 

你會得到t1t2相同的值(與「當前」時間,而不是1970年)。

因此,要解決此問題,asctime_slocaltime_s有一個額外的參數用於存儲數據。 asctime_s也有第二個額外的參數來告訴函數在存儲緩衝區中有多少空間,否則它可能溢出該緩衝區。

+1

那麼什麼是asctime_s和localtime_s的參數,以及我需要什麼新的變量來滿足它們呢? – Wenzel745

+0

查看提供的鏈接。 'asctime_s'上有一個非常好的例子,顯示了兩者的用法。 –

+0

對不起,我沒有注意到這些鏈接!謝謝。 – Wenzel745