我嘗試使用 strptime() 決議 ISO 8601 格式(由“%F”或“%Y-%m-%d”指定)中的日期,但是當我從結果結構 tm 中讀取時,我得到了荒謬的時間值,分鐘和秒。這是一個示例代碼和結果:
char *s_date = (char *)malloc(sizeof(char) * 255);
scanf("%s", s_date);
struct tm bd_date;
strptime(s_date, "%Y-%m-%d", &bd_date)
printf("%d-%d-%d %d:%d:%d\n", (bd_date.tm_year 1900), (bd_date.tm_mon 1), bd_date.tm_mday, bd_date.tm_hour, bd_date.tm_min, bd_date.tm_sec);
輸入“1990-05-01”的結果輸出為:1990-5-1 2007659173:32766:1076394855,其中顯示了 tm_hour、tm_min 和 tm_sec 的非法值。我究竟做錯了什么?有什么我想念的嗎?我雖然 strptime() 會自動將格式中未使用的欄位設定為 0,但似乎并非如此。
uj5u.com熱心網友回復:
Apple 的手冊頁strptime明確指出:
如果
format字串不包含足夠的轉換規范來完全指定結果struct tm, 的未指定成員timeptr保持不變。例如,如果格式為“%H:%M:%S”,則只有tm_hour、tm_sec和tm_min將被修改。
在Linux手冊頁是不是明確的,但與此一致:
原則上,此函式不會初始化,
tm而是僅存盤指定的值。這意味著tm應該在呼叫之前進行初始化。
Apple 的 macOS 和 Linux 都尋求符合的 POSIX 標準在我手頭的 2008 版本中既沒有上述內容,也沒有類似的文本。它只是對其他結構成員是否被修改或結構是否被初始化保持沉默。
因此,至少在某些實作中,strptime不會修改格式字串中沒有對應描述符的成員。例如,如果沒有諸如 之類的小時描述符%H,則不會修改結構的小時成員。如果你想設定這些成員,你可以在呼叫之前設定它們strptime。
uj5u.com熱心網友回復:
該strptime函式將只設定格式字串中指定的欄位。從手冊頁:
原則上,這個函式不初始化 tm 而是只存盤指定的值。這意味著 tm 應該在呼叫之前初始化。不同的 UNIX 系統之間的細節略有不同。glibc 實作不會觸及那些未明確指定的欄位,除非它在年、月或日元素中的任何一個發生更改時重新計算 tm_wday 和 tm_yday 欄位。
因此,在您的情況下,由于僅指定了年、月和日,因此僅設定了那些相應的欄位(以及星期幾和一年中的某天)。
uj5u.com熱心網友回復:
您可能需要在strptime自己呼叫之前將所有欄位設定為零。請注意,它struct tm bd_date;是在堆疊上分配的,因此此時 bd_date 充滿垃圾(隨機值),而不是充滿零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362969.html
下一篇:根據不同日期重新采樣時間序列
