C語言ctime()函數(shù)調(diào)用出現(xiàn)的返回值異常問題-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站主營平陸網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),平陸h5小程序定制開發(fā)搭建,平陸網(wǎng)站營銷推廣歡迎平陸等地區(qū)企業(yè)咨詢問題一:

調(diào)用ctime()后結(jié)尾自動換行。

問題復(fù)現(xiàn):

time_t ptime;
    time(&ptime);
    char *s = ctime(&ptime);
    printf("%s\n", s);

輸出結(jié)果:

最后一行多了一個換行符,保險起見講字符串每個字符轉(zhuǎn)為成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");

結(jié)尾是10,多了一個換行符無疑,這個問題倒是好解決:

time_t ptime;
    time(&ptime);
    char *s = ctime(&ptime);
    *(s + strlen(s) - 1) = 0;
    printf("%s\n", s);

再次輸出:

結(jié)尾的換行符去掉了,問題解決

問題二:

問題復(fù)現(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);

結(jié)果:

不僅最后的換行符沒了,連標(biāo)準(zhǔn)化輸出的最后幾個字符也沒了。

于是用gcc一調(diào)試:

三個指針指向了同一個地址,所以用上述方法去掉結(jié)尾換行符的時候相當(dāng)于把最后3個字節(jié)全改成了0,2022\n變成了20\0\0\0。

明明調(diào)用了三次ctime(),但是每一次指向的是同一個地址,很迷,然后繼續(xù)調(diào),看ctime()函數(shù)的實現(xiàn):

static __inline char *__CRTDECL ctime(const time_t *_Time) { return _ctime64(_Time); }

返回值是是一個指針,這個_ctime64()不知道是什么,上微軟官網(wǎng)一查:

看到了這么一段話,總結(jié)就是ctime()和gmtime(),localtime()共享一個靜態(tài)緩存區(qū),每一次調(diào)用都會覆蓋掉之前的值。那也就是說,在代碼中的三個指針指向的是同一個地址,每次修改都是對同一片內(nèi)存進行修改,修改了三次,所以才會導(dǎo)致輸出異常。

解決方法:

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);

給三個指針分配一個自己的空間然后把值復(fù)制過去,問題就解決了:

輸出正常。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

本文標(biāo)題:C語言ctime()函數(shù)調(diào)用出現(xiàn)的返回值異常問題-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://bm7419.com/article2/hohic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計公司、網(wǎng)站內(nèi)鏈、響應(yīng)式網(wǎng)站、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)