起因:操作系統(tǒng)實驗要求寫一個文件管理系統(tǒng),要求輸出一個文件的創(chuàng)建時間,修改時間和上次訪問時間。在文件的結構體中創(chuàng)建了三個time_t類型變量用于保存時間的值,需要輸出時調用ctime()函數(shù)格式化輸出,遇到了一些問題記錄一下。

調用ctime()后結尾自動換行。
問題復現(xiàn):
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);再次輸出:
![]()
結尾的換行符去掉了,問題解決
問題復現(xiàn):
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個字節(jié)全改成了0,2022\n變成了20\0\0\0。
明明調用了三次ctime(),但是每一次指向的是同一個地址,很迷,然后繼續(xù)調,看ctime()函數(shù)的實現(xiàn):
static __inline char *__CRTDECL ctime(const time_t *_Time) { return _ctime64(_Time); }返回值是是一個指針,這個_ctime64()不知道是什么,上微軟官網(wǎng)一查:

看到了這么一段話,總結就是ctime()和gmtime(),localtime()共享一個靜態(tài)緩存區(qū),每一次調用都會覆蓋掉之前的值。那也就是說,在代碼中的三個指針指向的是同一個地址,每次修改都是對同一片內(nèi)存進行修改,修改了三次,所以才會導致輸出異常。
解決方法:
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);給三個指針分配一個自己的空間然后把值復制過去,問題就解決了:

輸出正常。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文標題:C語言ctime()函數(shù)調用出現(xiàn)的返回值異常問題-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://chinadenli.net/article2/hohic.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、自適應網(wǎng)站、網(wǎng)站設計公司、網(wǎng)站內(nèi)鏈、響應式網(wǎng)站、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容