起因:操作系統(tǒng)實(shí)驗(yàn)要求寫一個文件管理系統(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é)果:
最后一行多了一個換行符,保險(xiǎn)起見講字符串每個字符轉(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ù)的實(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)存進(jìn)行修改,修改了三次,所以才會導(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海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧