起因:操作系統實驗要求寫一個文件管理系統,要求輸出一個文件的創建時間,修改時間和上次訪問時間。在文件的結構體中創建了三個time_t類型變量用于保存時間的值,需要輸出時調用ctime()函數格式化輸出,遇到了一些問題記錄一下。
調用ctime()后結尾自動換行。
問題復現:
time_t ptime;
time(&ptime);
char *s = ctime(&ptime);
printf("%s\n", s);
輸出結果:
最后一行多了一個換行符,保險起見講字符串每個字符轉為成ASCII碼打印出來:
time_t ptime;
time(&ptime);
char *s = ctime(&ptime);
// printf("%s\n", s);
for (int i = 0; i< strlen(s); i++)
{
printf("%d ", *(s + i));
}
printf("\n");
結尾是10,多了一個換行符無疑,這個問題倒是好解決:
time_t ptime;
time(&ptime);
char *s = ctime(&ptime);
*(s + strlen(s) - 1) = 0;
printf("%s\n", s);
再次輸出:
結尾的換行符去掉了,問題解決
問題復現:
char *dt1, *dt2, *dt3;
time_t ptime;
time(&ptime);
dt1 = ctime(&ptime);
dt2 = ctime(&ptime);
dt3 = ctime(&ptime);
*(dt1 + strlen(dt1) - 1) = 0;
*(dt2 + strlen(dt2) - 1) = 0;
*(dt3 + strlen(dt3) - 1) = 0;
printf("%s\n%s\n%s\n", dt1, dt2, dt3);
結果:
不僅最后的換行符沒了,連標準化輸出的最后幾個字符也沒了。
于是用gcc一調試:
三個指針指向了同一個地址,所以用上述方法去掉結尾換行符的時候相當于把最后3個字節全改成了0,2022\n變成了20\0\0\0。
明明調用了三次ctime(),但是每一次指向的是同一個地址,很迷,然后繼續調,看ctime()函數的實現:
static __inline char *__CRTDECL ctime(const time_t *_Time) { return _ctime64(_Time); }
返回值是是一個指針,這個_ctime64()不知道是什么,上微軟官網一查:
看到了這么一段話,總結就是ctime()和gmtime(),localtime()共享一個靜態緩存區,每一次調用都會覆蓋掉之前的值。那也就是說,在代碼中的三個指針指向的是同一個地址,每次修改都是對同一片內存進行修改,修改了三次,所以才會導致輸出異常。
解決方法:
char *dt1, *dt2, *dt3;
time_t ptime;
time(&ptime);
dt1 = (char *)malloc(25 * sizeof(char));
dt2 = (char *)malloc(25 * sizeof(char));
dt3 = (char *)malloc(25 * sizeof(char));
strcpy(dt1, ctime(&ptime));
strcpy(dt2, ctime(&ptime));
strcpy(dt3, ctime(&ptime));
*(dt1 + strlen(dt1) - 1) = 0;
*(dt2 + strlen(dt2) - 1) = 0;
*(dt3 + strlen(dt3) - 1) = 0;
printf("%s\n%s\n%s\n", dt1, dt2, dt3);
給三個指針分配一個自己的空間然后把值復制過去,問題就解決了:
輸出正常。
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文標題:C語言ctime()函數調用出現的返回值異常問題-創新互聯
網頁鏈接:http://vcdvsql.cn/article2/hohic.html
成都網站建設公司_創新互聯,為您提供外貿建站、自適應網站、網站設計公司、網站內鏈、響應式網站、微信小程序
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯